请参阅以下C代码.
#include <stdio.h>
int main(void)
{
char c1 = 3000;
char c2 = 250;
printf("%d\n",c1);
printf("%d\n",c2);
}
Run Code Online (Sandbox Code Playgroud)
上面代码的输出是
-72
-6
Run Code Online (Sandbox Code Playgroud)
请解释此处应用的整数到字符转换规则,因为3000和250都在char范围之外(-128到127).
请解释此处应用的整数到字符转换规则,因为3000和250都在char范围之外(-128到127).
首先请注意,C未指定是char已签名还是未签名.这是由实施来决定的,而且它们并不一致.在char无符号的实现上,250在其范围内.
但是,假设您的 char s已签名,这确实与您的结果一致,则赋值语句中隐含的转换的C规则将不会满足您:
新类型已签名,其值无法表示; 结果是实现定义的,或者引发实现定义的信号.
显然没有发出信号,因此结果是实现定义的.其中的可能性是CHAR_BIT每个指定值的最低有效位存储在目标变量中.
当您致电时,还有一个额外的转换printf().参数从charto 提升int,并且因为int可以表示所有类型的值char,所以它们是值保留的.这使我们得出结论,它确实是合理的,您的实现转换int到char仅保持最低显著位,并且将它们解释为8位二进制补码.