一个`char`永远总是有8位?
我一直以为:
- 一个
char
由一个字节表示, - 一个字节总是可以被计数到8位,
-
sizeof (char)
总是1
, - 并且我可以分配的最大理论内存量(以
char
单位)是RAM的字节数(交换空间)。
但是现在我已经阅读了维基百科条目上的字节,我不太确定了。
我的假设哪一个是错的? 哪一个是危险的?
-
是的,
char
和byte
几乎是一样的。 一个字节是最小的可寻址内存量,所以C中的char
也是一个char
。从规范中, 3.6字节 :
字节
数据存储器的可寻址单元足够大以容纳执行环境的基本字符集的任何成员
和3.7.1节的性质 :
字符
单字节字符
适合于一个字节的<C>位表示 -
char
有CHAR_BIT
位。 它可以是任何数字(嗯,根据规格8或更大),但绝对是最经常的8.有真正的机器16位和32位char
types,虽然。CHAR_BIT
在limits.h
定义。从规范中,第5.2.4.2.1节整数types的大小
<limits.h>
:下面给出的值应该被适用于
#if
预处理指令的常量expression式替代。 而且,除了CHAR_BIT
和MB_LEN_MAX
,下面的expression式将被replace为与根据整数升级转换的相应types的对象的expression式具有相同types的expression式。 它们的实现定义的值应该等于或大于所示的数值(绝对值),具有相同的符号。– 不是位域的最小对象的位数(字节)
CHAR_BIT
8
-
sizeof(char) == 1
。 总是。从规范中,第6.5.3.4节操作符的
sizeof
,第3段:当应用于具有
char
,unsigned char
或signed char
的操作数(或其合格版本)时,结果为1。 -
你可以分配尽可能多的内存,因为你的系统可以让你分配 – 标准中没有什么可以定义多less。 例如,您可以想象一台具有云存储支持的内存分配系统的计算机 – 您的可分配内存实际上可能是无限的。
这是完整的规范部分7.20.3.3
malloc
函数 :概要
1
#include <stdlib.h>
void *malloc(size_t size);
描述
2
malloc
函数为大小由size
指定且值不确定的对象分配空间。返回
3
malloc
函数返回空指针或指向分配空间的指针。这是整个规范,所以没有任何限制,你可以依靠。
sizeof(char)
被定义为始终为1
。 从C99开始:
当应用于具有char,unsigned char或signed char的操作数(或其合格版本)时,结果为1。
但不保证是8位。 实际上,在绝大多数的平台上,从技术angular度来看,不pipe怎么说,总是这样(不pipe怎么说,你应该使用sizeof
也不重要)。
sizeof(char)
总是1个字节。 然而,一个字节并不总是一个八位字节: 德州仪器TI C55x是一个16位字节的DSP。
传统上,一个字节不一定是8位,而只是一个小小的内存区域,通常适合存储一个字符。 C标准遵循这个用法,所以malloc和sizeof使用的字节可以超过8位。 [标准](标准不允许他们less)。
但是sizeof(char)总是1。
记住C FAQ是一个职业增强的举措。
具体来说,一些体系结构,特别是在DSP领域,其字节大于8位。 在实践中,他们为了速度牺牲了存储空间。
在C中,char总是一个字节,所以你的第一个和第三个假设是正确的。
一个字节并不总是8位,所以你的第二个假设并不总是成立。 也就是说,现在所有系统中大于99.99%都是8位字符,因此大量代码隐含地假定了8位字符,并在所有目标平台上运行良好。 当然,Windows和Mac机器总是使用8位字符,而AFAIK Linux也是如此(Linux已经移植到如此多的平台,我不能100%确定有人没有将Linux移植到9位字符的平台合理)。
可以分配的最大内存量是虚拟内存的大小,减去为操作系统保留的空间。
不幸的事情(也许幸运,取决于你如何看待事物)是什么字节通常被认为是(8位)的想法不是C编程语言认为是一个字节的意思。 回顾一下以前的一些答案,一个字节在C编程语言方面有一个确切的定义,在定义中没有提到一个8位的字节。 它只是提到了一个字节
“一个足以容纳执行环境的基本字符集的任何成员的可寻址数据存储单元”。
所以要回答你的问题:“一个char
总是总是有8位”,答案并不总是,但通常是这样。 如果您有兴趣查找您的数据types在您的系统上消耗了多less位空间,则可以使用以下代码行:
sizeof(type) * CHAR_BIT
其中, type
是您的数据types。 例如,要查明char
在系统上占用了多less位,可以使用以下命令:
printf("The number of bits a 'char' has on my system: %zu\n", sizeof(char) * CHAR_BIT);
这是从“GNU C库参考手册”中获取的,其中包含以下关于此主题的说明:
在C语言中没有操作符可以给你一个整型数据types的位数。 但是你可以从头文件limits.h中定义的macrosCHAR_BIT来计算它。 CHAR_BIT – 这是大多数系统中char-eight中的位数。 该值具有typesint。 您可以计算任何数据typestypes的位数,如下所示:
`sizeof (type) * CHAR_BIT`
该expression式包括填充位以及值和符号位。