声明字符时char和int之间的区别

时间:2016-05-15 17:21:10

标签: c

我刚刚开始学习C而且对使用int和char声明字符感到困惑。

我很清楚任何字符都是由整数组成的,因为"整数"字符是字符'各自的ASCII小数。

也就是说,我了解到使用int声明一个字符而不使用ASCII小数是完全可能的。例如。将变量test声明为字符'X'可以写为:

char test = 'X';

int test = 'X';

对于两个字符声明,转换字符为%c(即使测试定义为int)。

因此,我的问题是/是使用charint声明字符变量与何时使用int声明字符变量之间的差异?

5 个答案:

答案 0 :(得分:40)

差异在于变量的字节大小,从那里变量可以容纳不同的值。

char需要接受0到127之间的所有值(包括在内)。因此,在常见的环境中,它会完全占据 一个字节(8位)。标准未指定是签名(-128-127)还是无符号(0-255)。

int必须至少是一个16位有符号字,并接受-32767和32767之间的所有值。这意味着int可以接受来自char的所有值,后者是有符号或无符号的。

如果您只想在变量中存储字符,则应将其声明为char。使用int只会浪费内存,并可能误导未来的读者。该规则的一个常见例外是当您想要为特殊条件处理更宽的值时。例如,标准库中的函数fgetc被声明为返回int

int fgetc(FILE *fd);

因为特殊值EOF(对于End of File)被定义为int值-1(在2补码系统中所有位为1),这意味着超过a的大小焦炭。这样,没有char(在公共系统上只有8位)可以等于EOF常量。如果声明函数返回一个简单的char,则没有任何东西可以区分EOF值和(有效)char 0xFF。

这就是为什么以下代码错误并且永远不应该使用的原因:

char c;    // a terrible memory saving...
...
while ((c = fgetc(stdin)) != EOF) {   // NEVER WRITE THAT!!!
    ...
}

在循环内部,char就足够了,但是为了在读取字符0xFF时测试不成功,变量需要是一个int。

答案 1 :(得分:6)

char类型有多个角色。

首先,它只是整数类型链的一部分,charshortintlong等,所以它'只是数字的另一个容器。

第二个是它的底层存储是最小的单元,而所有其他对象的大小是char的大小的倍数(sizeof返回一个以{为单位}的数字{1}},所以char)。

第三是它在字符串中扮演角色的角色,当然在历史上。当看到这样的时候,sizeof char == 1的值映射到指定的字符,例如通过ASCII编码,但它也可以用于多字节编码(一个或多个char一起映射一个角色。)

答案 2 :(得分:2)

通常你应该将字符声明为char并使用int来表示能够容纳更大值的整数。在大多数系统中,char占用一个8位的字节。根据您的系统,默认情况下此char可能是有符号或无符号的,因此它可以保存0-255或-128-127之间的值。

int可能是32位长,但如果你真的想要整数32位,你应该将它声明为int32_t或uint32_t。

答案 3 :(得分:2)

大多数架构上int的大小为4个字节,而char的大小为1个字节。

答案 4 :(得分:1)

我认为没有区别,但是你要分配额外的内存而你将不会使用。您也可以执行const long a = 1;,但更适合使用const char a = 1;