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

时间:2011-06-19 05:28:43

标签: c

查看此计划

#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码)的东西,为什么没有溢出等。

3 个答案:

答案 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个字节。

顺便说一句好问题 - 让我感到困惑。