我有以下C代码,我必须理解为什么结果是一个相当大的正数:
int k;
unsigned int l;
float f;
f=4; l = 1; k = -2;
printf("\n %f", (unsigned int)l+k+f);
结果是一个非常大的数字(大约40亿,32位整数的最大值),所以我怀疑它与有符号的负整数(两个补码)的表示有关,看起来相当大我们认为它是无符号的。
但是我不太明白为什么它会以这种方式运行以及float与行为有什么关系(如果我删除它就会停止这样做)。有人可以解释它是如何做到的吗?添加导致此结果的数字时会发生什么过程?
答案 0 :(得分:2)
问题在于,当您将签名int
添加到unsigned
时,C会将结果转换为unsigned int
,甚至是负数。{由于k
为负数,因此在添加之前会将其重新解释为大的正数。之后添加f
,但与负2重新解释为正数相比较小。
以下是问题的简短说明:
int k = -2;
unsigned int l = 1;
printf("\n %u", l+k);
这会在32位系统上打印4294967295
,因为两个补码表示中的-2
为0xFFFFFFFE
(demo)。
答案 1 :(得分:0)
答案是当编译器执行l + k时,它将k转换为unsigned int,将其转换为该大数。如果您将变量的顺序更改为:l + f + k,则不会发生此行为。
答案 2 :(得分:0)
通过将最大无符号值加1重复加到有符号值直到它可表示为止,将负整数转换为unsigned
整数。这就是为什么你看到如此大的价值。
使用两个补码,它与截断或符号扩展值并将其解释为unsigned
相同,这对于计算机来说很简单。