请参阅以下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)。
答案 0 :(得分:5)
请解释此处应用的整数到字符转换规则,因为3000和250都在char范围之外(-128到127)。
首先请注意,C未指定char
是签名还是未签名。这是由实施来决定的,而且它们并不一致。在char
未签名的实现上,250在其范围内。
但是,假设您的 char
已签名,这确实与您的结果一致,则赋值语句中隐含的转换的C规则将不会让您满意:< / p>
新类型已签名且值无法在其中表示;结果是实现定义的,或者引发实现定义的信号。
显然没有发出任何信号,因此结果是实现定义的。其中的可能性是每个赋值的最不重要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。