类型转换为不同的数据类型时会发生什么

时间:2010-12-16 09:29:40

标签: c

为什么这个代码的输出fffffffa而不是0000000a

char c=0Xaa;
     int b=(int)c;
     b=b>>4;
     printf("%x",b);

我认为是char c = OXaa将是aa,当它被强制转换为int时,它会变为000000aa。

任何人都可以告诉我当char被转换为整数时发生了什么......

3 个答案:

答案 0 :(得分:3)

int已签名,因此向上扩展是符号扩展。考虑二进制表示。

0xAA = 10101010

char经常是签名的,所以当您转换为(默认签名)int时,第一个1表示它被解释为负二进制补码数:

((int) ((signed char)0xAA) ) = 11111111111111111111111110101010

要避免这种情况,请使用unsigned charunsigned int

答案 1 :(得分:1)

编译器的char类型已签名,因此当它转换为int时,由于设置了最高位,因此会对其进行符号扩展。

然后,右移运算符保持负值,并在顶部移动新的运算符。右移一个负值是一个未定义的操作,所以不要这样做。

答案 2 :(得分:0)

这取决于所使用的架构(CPU)以及编译器。

在你的情况下,我的猜测是变量c的值被放在一个cpu寄存器中,其中只定义了低8位。当转换为int并复制到另一个变量时,那些具有“未定义”值的位也会被复制,并且由于它们现在是整数值的一部分,因此被视为有效。

要解决此问题,您可能需要复制c值,如下所示:

int b = (int)c & 0xff;