我在StackOverflow上随机冲浪。当我看到一个问题时,我变得一无所知。为什么我们可以将整数值分配给char变量?
代码段:
#include <stdio.h>
int main()
{
char c = 130;
unsigned char f = 130;
printf("c = %d\nf = %d\n",c,f);
return 0;
}
输出:
c = -126
f = 130
我一直认为必须将值分配给正确的类型标识符,为什么我们可以这样做?
答案 0 :(得分:4)
这是因为char
是一种整数类型(最小的一种),并且可以隐式转换不同整数类型的值。但是请注意,示例代码在具有 signed 8bit char
*)的典型机器上具有实现定义的行为:130
溢出(最大值将是是127
),并且在转换期间溢出有符号整数类型的结果已定义为实现。
您可能会问这个问题,因为您认为char
用于存储字符。这确实是正确的,但是字符是。有关更多详细信息,请参见Character Encoding。
*)char
(没有显式signed
或unsigned
)是否已签名是由实现定义的,位数也是如此,但必须至少为8。
答案 1 :(得分:2)
引用C11
,第§6.5.16.1p2章
在简单赋值(=)中,将右操作数的值转换为赋值表达式的类型,并替换存储在由左操作数指定的对象中的值。
这意味着赋值运算符中的RHS被隐式转换为LHS上变量的类型。在您的情况下,整数常量将转换为char
类型。
此外,C中没有char
常量。像'a'
,'B'
之类的字符常量都是int
类型的。