如果我在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是相同的吗?
是否有任何值会导致这种情况不正确?
答案 0 :(得分:2)
您在C中给出的示例不正确。此外,保留位模式(转换是按值)不需要在有符号和无符号类型之间进行转换,尽管使用某些表示可以保留位模式。
在某些情况下,操作结果会相同,而且结果会有所不同。
int
s的(实际)总和将溢出int
(即,int
可以表示的值超出范围)结果是
未定义的行为。任何事情都可能发生在那一点上(包括
程序异常终止) - 随后转换为unsigned
不会改变任何内容。int
转换为unsigned int
使用模数
算术(以unsigned
可以的最大值为模
代表,再加上一个)。这标准很明确,但是
表示-1(类型int
)将转换为最大值
unsigned可以表示(即UINT_MAX
,定义的实现
<limits.h>
)中指定的值。unsigned int
类型的变量总是使用
模数算术。由于这样的事情,你的问题&#34;会产生最多的?&#34;没有意义。