声明字符时char和int之间的区别
我刚刚开始学习C而且对使用int和char声明字符感到困惑。
我很清楚,任何字符都是由整数组成的,因为字符的“整数”是字符的各个ASCII小数。
也就是说,我了解到完全可以在不使用ASCII小数的情况下使用int
声明一个字符。 例如。 将变量test
声明为字符'X'
可以写成:
char test = 'X';
和
int test = 'X';
对于两个字符声明,转换字符都是%c
(即使test定义为int
)。
因此,我的问题是使用char
和int
声明字符变量与何时使用int
来声明字符变量之间的差异?
差异是变量的字节大小,从那里变量可以容纳不同的值。
char需要接受0到127之间的所有值(包括在内)。 因此在通用环境中,它只占用一个字节(8位)。 标准未指定是签名(-128-127)还是无符号(0-255)。
int必须至少是一个16位有符号字,并接受-32767和32767之间的所有值。这意味着int可以接受char中的所有值,后者是有符号或无符号的。
如果只想在变量中存储字符,则应将其声明为char
。 使用int
只会浪费内存,并可能误导未来的读者。 该规则的一个常见例外是当您想要为特殊条件处理更宽的值时。 例如,标准库中的函数fgetc
被声明为返回int
:
int fgetc(FILE *fd);
因为特殊值EOF
(对于文件结束)被定义为int
值-1(在2补码系统中所有位为1),这意味着大于char的大小。 这样,没有char(在公共系统上只有8位)可以等于EOF常量。 如果声明函数返回一个简单的char
,则没有任何东西可以将EOF值与(有效)char 0xFF区分开来。
这就是为什么以下代码不好而且永远不应该使用的原因:
char c; // a terrible memory saving... ... while ((c = fgetc(stdin)) != EOF) { // NEVER WRITE THAT!!! ... }
在循环内部,char就足够了,但是为了在读取字符0xFF时测试不成功,变量需要是一个int。
char
类型有多个角色。
第一个是它只是整数类型链的一部分, char
, short
, int
, long
等,所以它只是数字的另一个容器。
第二个是它的底层存储是最小的单元,而所有其他对象的大小是char
的大小的倍数( sizeof
返回一个以char
为单位的数字,因此sizeof char == 1
)。
第三是它在字符串中扮演角色的角色,当然在历史上。 当这样看时, char
的值映射到指定的字符,例如通过ASCII编码,但它也可以与多字节编码一起使用(一个或多个char
一起映射到一个字符)。
通常你应该将字符声明为char,并使用int来表示能够容纳更大值的整数。 在大多数系统中,char占用一个8位的字节。 根据您的系统,默认情况下此char可能是有符号或无符号的,因此它可以保存0-255或-128-127之间的值。
一个int可能是32位长,但如果你真的想要整数32位,你应该将它声明为int32_t或uint32_t。
在大多数体系结构中, int
大小为4个字节,而char
的大小为1个字节。
我认为没有区别,但是你要分配额外的内存而你将不会使用。 你也可以做const long a = 1;
,但更适合使用const char a = 1;
代替。