C和C++字符字节数大小问题

时间:2022-01-03 19:31:27

学过C或者C++的同学一想到字符肯定首先想到的是占用一个字节的存储空间,但事实真的如此吗。
先看一段代码:

#include <stdio.h>

int main(void)
{
printf("sizeof(char)=%ld\n", sizeof(char));
printf("sizeof('A')=%ld\n", sizeof('A'));

return 0;
}

通过GCC编译器编译得出结果:
C和C++字符字节数大小问题

再来看看同样代码的G++编译的结果:
C和C++字符字节数大小问题

char字符类型无论是在C还是C++中都是占单个字节的,毕竟组成字符串的基础类型,不是单字节就问题大了。
而字符常量,比如’A’、’B’、’c’这种在C语言中单个占用4个字节,而在C++中单个占用1一个字节,是否觉得奇怪,为什么会这样。原因就是:C语言把字符当做小整数进行处理。字符常量实际上是int类型而不是char类型!而在C++中则会直接把字符常量当做char类型进行处理!

看了上述结果的而又喜欢用C语言字符数组或字符指针做字符串而不是C++string做字符串的同学可能会多思考一些问题了,如果字符常量是占用4个字节,那么char arr[10] = {‘A’, ‘B’, ‘C’, ‘d’};这样的数组是否会越界呢?

#include <stdio.h>

int main(void)
{
const char arr[10] = {'A', 'B', 'C', 'd'};

printf("arr=%s\n", arr);

if (arr[4] == '\0')
printf("fifth char='\\0'\n");

return 0;
}

GCC编译器编译后结果为:
C和C++字符字节数大小问题
很明显,在初始化char数组的时候,由于元素类型必须是char类型,所以字符常量直接转换成char类型了。当然,char类型具体是有符号还是无符号也是一个问题,有些编译器当成有符号,有些编译器当成无符号,甚至有的可以自己选择char是有符号还是无符号。但是作为程序员总是要注意:忽略语法具体的差异性就是在拿程序的安全性冒险!