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

CAS*_*ASE 2 c

请参阅以下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).

Joh*_*ger 5

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

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

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

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

(C2011 6.3.1.3/3)

显然没有发出信号,因此结果是实现定义的.其中的可能性是CHAR_BIT每个指定值的最低有效位存储在目标变量中.

当您致电时,还有一个额外的转换printf().参数从charto 提升int,并且因为int可以表示所有类型的值char,所以它们是值保留的.这使我们得出结论,它确实是合理的,您的实现转换intchar仅保持最低显著位,并且将它们解释为8位二进制补码.