总结未签名和签名的整数,相同或不同的答案?

时间:2015-02-06 22:58:06

标签: c

如果我在C

中有以下代码
int main()
{
    int x = <a number>
    int y = <a number>
    unsigned int v = x;
    unsigned int w = y;
    int ssum = x * y;
    unsigned int usum = v * w;
    printf("%d\n", ssum);
    printf("%d\n", usum);
    if(ssum == usum){
        printf("Same\n");
    } else {
        printf("Different\n");
    }

return 0;
}

哪种打印最多?它是否相等,因为有符号和无符号会产生相同的结果,那么如果你有负像-1,当它被赋值给int x时它变成0xFF,如果你想做-1 +(-1 ),如果你这样做的签名方式得到-2 = 0xFE,并且由于无符号变量将设置为0xFF,如果你添加它们,你仍然会得到0xFE。对于2 +( - 3)或-2 + 3也是如此,最后十六进制值是相同的。所以在C中看到signedSum == unsignedSum时会看到什么?它并不关心一个实际上是一个大数字而另一个是-2,只要1和0是相同的吗?

是否有任何值会导致这种情况不正确?

1 个答案:

答案 0 :(得分:2)

您在C中给出的示例不正确。此外,保留位模式(转换是按值)不需要在有符号和无符号类型之间进行转换,尽管使用某些表示可以保留位模式。

在某些情况下,操作结果会相同,而且结果会有所不同。

  • 如果添加两个int s的(实际)总和将溢出int (即,int可以表示的值超出范围)结果是 未定义的行为。任何事情都可能发生在那一点上(包括 程序异常终止) - 随后转换为unsigned不会改变任何内容。
  • 将带有负值的int转换为unsigned int使用模数 算术(以unsigned可以的最大值为模 代表,再加上一个)。这标准很明确,但是 表示-1(类型int)将转换为最大值 unsigned可以表示(即UINT_MAX,定义的实现 <limits.h>)中指定的值。
  • 同样,添加两个unsigned int类型的变量总是使用 模数算术。

由于这样的事情,你的问题&#34;会产生最多的?&#34;没有意义。