#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
答案 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。