使用char代替'int'最大的好处是什么

时间:2016-07-28 12:42:42

标签: c

以下是将大字母转换为小写字母的代码,反之亦然。

#if SOL_2
        char ch;
        char diff = 'A' - 'a';
        //int diff = 'A' - 'a';
        fputs("input your string : ", stdout);

        while ((ch = getchar()) != '\n') {
            if (ch >= 'a' && ch <= 'z') {
                ch += diff;
            }
            else if (ch >= 'A' && ch <= 'Z') {
                ch -= diff;
            }
            else {}

            printf("%c", ch);
        }
#endif

以上代码代替char diff = 'A' - 'a',我使用int = 'A' -'a',结果相同。因此,我认为使用字符可以节省内存,因为char是一个字节,但int是四个字节。我想不出它的其他优点。 如果你让我了解它的其他优点,我将不胜感激。

使用char存储字符值的主要原因是什么? 这是因为内存大小问题?

4 个答案:

答案 0 :(得分:8)

您应该使用int chint diff

  • getchar()返回int,而不是char。因此ch必须为int。这样您就可以区分文件结尾和字符0xff,这两者在签名字节中都是-1。 (reference
  • char可能是signedunsigned(请参阅this answer)。因此,您应该使用int进行比较,以便知道您有负值的余地(int is signed by default)。

要回答您的具体问题,请在知道自己有字节数据时使用char,是的,您很可能会节省一些内存。使用char(或wchar_t或其他字符类型)的另一个原因是让读者明白您希望这些数据是文本而不是数字,如果确实是这样的话。 char的另一个用例是访问文件或其他数据流的各个字节。

答案 1 :(得分:1)

  

使用char存储字符值的主要原因是什么?这是因为内存大小问题?

charint数组序列字符一起使用的主要用途是空间(以及广泛的计算机上的处理速度)体系结构)。如果代码使用限制为8位范围的字符,则过大的数据类型会减慢速度。

对于单个类型的实例,int通常更好,因为它通常是处理器优化的“本机”类型。

然而,对单个char vs int进行优化(假设两者都在应用程序中工作)通常不能充分利用您的时间。担心更大的问题,让编译器优化小东西。

请注意,int getchar()会在unsigned charEOF范围内返回。这些通常257个不同的值无法明确存储在char中。使用int

C提供isupper()islower()toupper()tolower(),是处理简单字符大小写转换的强大方法。

if (isupper(ch)) ch = tolower(ch);

使用示例:

int ch;   
while ((ch = getchar()) != '\n' && ch != EOF) {
  if (isupper(ch)) {
    ch = tolower(ch);
  }
  else if (islower(ch)) {
    ch = toupper(ch);
  }
  printf("%c", ch);
}
fflush(stdout);

使用ASCIIEBCDIC以及我遇到的每个小字符编码,可以通过简单切换来完成A-Z大小写转换。注意没有神奇的数字。

ch ^= 'A' ^ 'a';

使用示例:

int ch;   
while ((ch = getchar()) != '\n' && ch != EOF) {
  if (isalpha(ch)) {
    ch ^= 'A' ^ 'a';
  }
  printf("%c", ch);
}
fflush(stdout);

答案 2 :(得分:1)

是的,你指出我们在char中使用的字符只是1字节的二进制代码,即256个数字,二进制中的每个数字代表映射到字符的数字(可能不是所有二进制数字代表它所依赖的不同字符您使用哪种编码)参考unicode编码,不要只考虑英语考虑其他语言字符以及chinesse或hindi ......等等。因此,这种语言中的每个字符都需要用标准化的数字来表示通过unicode

所以重点是当你使用java的char时它只包含一部分只有英文字母的字母,但是当你开发一个能够选择不同语言显示的国际软件时,你应该使用int。但是,如果你的范围只有英语,那么char将是最好的选择,因为当你使用int时它消耗了更多的未使用位的位,这些位被填充为零,这只是额外的位,没有任何意义来匹配int的长度< / p>

假设您在编辑器中打开了一个中文语言文本,如记事本,如果字符编码设置为ASCII,ascii有一个小字符集,只有英文AZ,az,0-9,空格,换行符......就像256个字符,您将在文件中看到有线字符,就像二进制文件一样,查看您需要将编码更改为UTF-8的文件的实际内容,使用unicode字符集,现在您可以看到文本

答案 3 :(得分:0)

阅读标准6.3.1.8 Usual arithmetic conversions6.3.1.1 Boolean, characters, and integers

  

如果int可以表示原始类型的所有值[...],则该值将转换为int;

char c1 = 'A', c2 = 'Z';
c2 - c1;                   // expression without side effects

上面的表达式,在执行减法之前,xy都会转换为int