int是4个字节,但它仍然可以存储在char中,为什么没有溢出

Reg*_*ser 13 c

看看这个程序

#include<stdio.h>

int main (){

char c='a';
printf("%d %d", sizeof(c),sizeof('a'));
}
Run Code Online (Sandbox Code Playgroud)

输出是1 4
我知道当我们写一个语句char c ='a';

那么如何在1字节(char c)的空间中存储一些4字节(ASCII码)的东西,为什么没有溢出等.

bdo*_*lan 15

首先,根据ANSI/IEC 9899:1999(E)§6.4.4.4:

 10.整数字符常量的类型为int.包含映射到单字节执行字符的单个字符的整数字符常量的值是解释为整数的映射字符的表示的数值.[...]

§6.5.3.4:

 2. sizeof运算符产生其操作数的大小(以字节为单位),可以是表达式或类型的带括号的名称.大小由操作数的类型确定.[...]

 3.当应用于具有char,unsigned char或signed char(或其合格版本)类型的操作数时,结果为1. [...]

正如你所看到的,因为字符常量的类型是int,对于sizeof('a')我们得到的sizeof(int),这是4你的平台上.但是,对于sizeof(c),我们得到a的大小,char定义为1.

那么为什么我们可以分配'a'char

§6.5.16.1:

 2.在简单赋值(=)中,右操作数的值将转换为赋值表达式的类型,并替换存储在左操作数指定的对象中的值.

所以,int那是'a'隐式转换为a char.这里也有一个例子,明确显示ints可以隐式转换为char.

  • 如果你想真正*迂腐,请引用6.3.1.3/1,"如果值可以用新类型表示,则不变"和6.2.5/3,"`char`足够大存储基本执行字符集",和5.2.1/3"的任何成员基本执行字符集应具有...拉丁字母的26个小写字母":-) (5认同)