我很惊讶这个函数为 dif1 和 dif2 产生不同的值
void test()
{
unsigned int x = 0, y = 1;
long long dif1 = x - y;
long long dif2 = (int)(x - y);
printf("dif = %lld %lld",dif1,dif2);
}
这是正确的行为吗?在 diff1 计算中,它首先将 32 位无符号差提升为 64 位无符号值,然后添加符号。这是语言未指定的标准行为,还是编译器错误?第二种形式是否保证产生-1,或者取决于编译器的实现?我认为最安全的结构是:
长长dif3 = (长长)x - (长长)y;
第一个是明确定义的,如果我们假设long long
比unsigned int
。如果不是,那么作业给出的问题与答案的第二部分相同。
long long dif1 = x - y;
无符号整数将换行,您将获得可以存储在无符号整数中的最大值。
6.2.5 p9:涉及无符号操作数的计算永远不会溢出,
因为无法用结果无符号整数类型表示的结果是
减少对比最大值大 1 的数取模
由结果类型表示。
至于第二个
long long dif2 = (int)(x - y);
它是实现定义的:
6.3.1.3 p3:否则,新类型是有符号的,并且值不能在其中表示;要么
结果是实现定义的或引发实现定义的信号。
在这种情况下,最大值为unsigned int
不能用一个表示int
以上规则生效。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)