C中的类型转换导致信息丢失

时间:2018-11-28 19:42:42

标签: c compilation

#include <stdio.h>

int main(int argc, char const *argv[])
{
    int x = 128;
    char y = x;
    int z = y;
    printf("%d\n", z);
    return 0;
}

我不明白为什么该程序打印-128。 我已经尝试过以二进制为基础转换128,但是我仍然对C编译器如何将int转换为char和char转换为int感到困惑。

注意:在我的计算机上,sizeof(char)= 1且sizeof(int)= 4

2 个答案:

答案 0 :(得分:1)

C标准does not specify whether char is signed or unsigned。实际上,为char类型分配基本执行字符集之外的值是实现定义的。您可能可以使用<limits.h>中的宏进行验证。

我怀疑您的系统上的char已签名,使得最大值127。Signed interger overflow is undefined。因此,对输出没有任何保证。在这种情况下,它看起来像是环绕着。

答案 1 :(得分:1)

假设char的符号为8位,其范围是-128到127,这意味着值128超出了char的范围。因此,将以实现定义的方式转换该值。如果是gcc,结果将以模2 8 减少到范围内。

这基本上意味着将int值128的低位字节分配给char变量。十六进制的128(作为32位)是0x00000080,因此0x80被分配给y。假设2的恭维表示,则表示值-128。然后将此值分配给z的{​​{1}}时,可以在int中表示该值 ,这就是分配给它的内容,其表示形式为0xffffff80。