当int超出char范围时,C中的Int到char转换规则

时间:2018-06-01 00:08:46

标签: c

请参阅以下C代码。

#include <stdio.h>

int main(void)
{
    char c1 = 3000;
    char c2 = 250;
    printf("%d\n",c1);
    printf("%d\n",c2);
}

上述代码的输出是

-72

-6

请解释此处应用的整数到字符转换规则,因为3000和250都在char范围之外(-128到127)。

2 个答案:

答案 0 :(得分:5)

  

请解释此处应用的整数到字符转换规则,因为3000和250都在char范围之外(-128到127)。

首先请注意,C未指定char是签名还是未签名。这是由实施来决定的,而且它们并不一致。在char未签名的实现上,250在其范围内。

但是,假设您的 char已签名,这确实与您的结果一致,则赋值语句中隐含的转换的C规则将不会让您满意:< / p>

  

新类型已签名且值无法在其中表示;结果是实现定义的,或者引发实现定义的信号。

C2011 6.3.1.3/3

显然没有发出任何信号,因此结果是实现定义的。其中的可能性是每个赋值的最不重要CHAR_BIT位存储在目标变量中。

当您致电printf()时,会有额外的转化。参数从char升级到int,由于int可以表示类型char的所有值,因此该值是保值的。这使我们得出结论,您的实现通过仅保留最低有效位并将它们解释为8位二进制补码来将int转换为char确实合理。

答案 1 :(得分:1)

Integer使用4个字节,char使用1个字节。 C中的数字表示为带符号,表示左边的第一位表示符号(正数,负数),其余数字表示满数字。因此,数字3000在二进制中表示为00000000000000000000000010111000,对于int,它就像这样存储。因为char只有1个字节,所以最后8位表示char变量中保存的数字,即10111000。当你将它转换为十进制时,你将有-72。