C中的可变转换混合

时间:2015-11-12 20:43:06

标签: c

我有以下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与行为有什么关系(如果我删除它就会停止这样做)。有人可以解释它是如何做到的吗?添加导致此结果的数字时会发生什么过程?

3 个答案:

答案 0 :(得分:2)

问题在于,当您将签名int添加到unsigned时,C会将结果转换为unsigned int,甚至是负数。{由于k为负数,因此在添加之前会将其重新解释为大的正数。之后添加f,但与负2重新解释为正数相比较小。

以下是问题的简短说明:

int k = -2;
unsigned int l = 1;
printf("\n %u", l+k);

这会在32位系统上打印4294967295,因为两个补码表示中的-20xFFFFFFFEdemo)。

答案 1 :(得分:0)

答案是当编译器执行l + k时,它将k转换为unsigned int,将其转换为该大数。如果您将变量的顺序更改为:l + f + k,则不会发生此行为。

答案 2 :(得分:0)

通过将最大无符号值加1重复加到有符号值直到它可表示为止,将负整数转换为unsigned整数。这就是为什么你看到如此大的价值。

使用两个补码,它与截断或符号扩展值并将其解释为unsigned相同,这对于计算机来说很简单。