查看此计划
#include<stdio.h>
int main (){
char c='a';
printf("%d %d", sizeof(c),sizeof('a'));
}
输出为1 4
我知道什么时候写一个语句char c ='a';
然后如何在1字节的空间(char c)中存储4字节(ASCII码)的东西,为什么没有溢出等。
答案 0 :(得分: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)
,我们得到char
的大小,定义为1。
那么为什么我们可以将'a'
分配给char
?
§6.5.16.1:
2.在简单赋值(=)中,右操作数的值将转换为赋值表达式的类型,并替换存储在左操作数指定的对象中的值。
因此,int
'a'
被隐式转换为char
。这里也有一个示例,明确显示int
可以隐式转换为char
。
答案 1 :(得分:2)
编译器隐式将int
转换为char
。
int i = 42;
char c = i * 2 - 4;
编译器将最后一行解释为:
char c = (char)(i * 2 - 4);
这些implicit type conversions由编译器处理 - 没有“缓冲区溢出”。 (char)
是在内部处理的(由机器本身处理,最有可能是针对像int
这样的简单类型)。它适当地减少了额外的字节并保留了“签名”(+
/ -
)。
答案 2 :(得分:1)
“字符文字的类型为int”(http://publib.boulder.ibm.com/infocenter/lnxpcomp/v7v91/index.jsp?topic=%2Fcom.ibm.vacpp7l.doc%2Flanguage%2Fref%2Fclrc02ccon热媒)
但是C让你在理论上做出“不安全”的自动演员 - 例如,
char c = 34;
尽管34显然是4字节的int。什么使这个安全是因为你知道什么时候写'a'它实际上是1个ascii字符,因此是1个字节。
顺便说一句好问题 - 让我感到困惑。