我一直认为:
char
由一个字节表示,- 一个字节始终有8位,
sizeof(char)
始终为1
,- 我可以分配的最大理论内存量(以
char
计)是 RAM 的字节数(加上交换空间)。
但现在我已经阅读了 Wikipedia 上的字节条目,我不再那么确定了。
我的哪些假设是错误的?哪些是危险的?
我一直认为:
char
由一个字节表示,sizeof(char)
始终为 1
,char
计)是 RAM 的字节数(加上交换空间)。但现在我已经阅读了 Wikipedia 上的字节条目,我不再那么确定了。
我的哪些假设是错误的?哪些是危险的?
是的,char
和byte
几乎相同。Byte是最小的可寻址内存量,C中的char
也是如此。char
的大小始终为1。
从规范的第3.6节byte中可以看到:
byte
可寻址的数据存储单元,足以容纳执行环境中基本字符集中的任何成员
还有第3.7.1节character:
character
单字节字符
<C>适合于一个字节的位表示
char
具有CHAR_BIT
位。它可以是任何数字(根据规范,至少为8),但通常最常用的是8位。然而,真正的机器有16位和32位的char
类型。CHAR_BIT
在limits.h
中定义。
从规范的第5.2.4.2.1节整数类型的大小<limits.h>中可以看到:
下面给出的值将被可用于
预处理指令的适当常量表达式所取代。而且,除了#if
CHAR_BIT
和MB_LEN_MAX
之外,以下将被替换为具有与转换为整数提升后对应类型的对象相同类型的表达式。它们的实现定义值的绝对值(magnitude)将等于或大于(绝对值)所示的值,并具有相同的符号。——不是位域的最小对象的位数(字节)
CHAR_BIT
8
sizeof(char) == 1
。始终如此。
从规范的第6.5.3.4节 sizeof操作符,第3段:
当应用于具有类型的操作数
char
、unsigned char
或signed char
(或其限定版本)时,结果为1。
您可以分配尽可能多的内存 - 标准中没有定义可以分配多少内存。例如,您可以想象一个带有云存储支持的内存分配系统的计算机 - 您可以分配的内存实际上可能是无限的。
这里是完整的规范部分7.20.3.3函数malloc:
概要
1
#include <stdlib.h>
void *malloc(size_t size);
描述
2
malloc
函数分配一个大小由size
指定且值不确定的对象的空间。返回
3
malloc
函数返回null指针或指向分配空间的指针。
这就是整个规范,因此你实际上没有任何可以依赖的限制。
sizeof(char)==1
(true)可以得出类型char
中位数为CHAR_BIT
,即没有填充位?无论答案如何,请重新开放我的问题,因为你的答案对于我来说至少没有回答我的问题 -- 这些问题是相关的,但我没有看到答案中的联系。 - jfsbyte == char
不是精确的,即它是错误的。(无关:我在你的答案中没有看到“最小”的字眼)。在许多情况下,它们可以互换使用(我同意“几乎相同”),但它们并不完全相同(正如您自己答案中的C标准引用所明确说明的那样)。char
是一种类型。字节是一种存储单元。字符适合一个字节。恰好发生所有CHAR_BIT
位都被char
类型使用(没有填充位),因此“一个字符有CHAR_BIT
位。”是正确的,但这并不是从第1部分得出的。 - jfssizeof(char)
始终为 1 字节。然而,一个字节不总是一个八位组:例如,德州仪器 TI C55x 是一种带有 16 位字节的 DSP。
sizeof(char)
被定义为始终等于 1
。来自 C99 标准:
当应用于类型为 char、unsigned char 或 signed char(或其限定版本)的操作数时,结果为 1。
然而,并不保证它是8位。实际上,在绝大多数平台上都是这样,但从技术角度来说不能保证总是这种情况(也不应该过于关心,因为您应该使用 sizeof
)。
具体而言,一些架构,特别是在DSP领域,其字符长度超过8位。实际上,它们为了速度而牺牲了内存空间。
sizeof(char)
始终为1,这并不意味着char始终为8位。 - Ed S.char
是否总是有8位”,答案是,不总是,但大多数情况下它会有8位。如果您想了解您的系统上数据类型消耗了多少位空间,您可以使用以下代码行:sizeof(type) * CHAR_BIT
其中,type
是您的数据类型。例如,要找出在您的系统上一个char
占用多少位,您可以使用以下代码:
printf("The number of bits a 'char' has on my system: %zu\n", sizeof(char) * CHAR_BIT);
以下内容摘自GNU C库参考手册,其中对这个主题有如下启发性的解释:
There is no operator in the C language that can give you the number of bits in an integer data type. But you can compute it from the macro CHAR_BIT, defined in the header file limits.h. CHAR_BIT — This is the number of bits in a char—eight, on most systems. The value has type int. You can compute the number of bits in any data type type like this:
`sizeof (type) * CHAR_BIT`
That expression includes padding bits as well as value and sign bits.
char
类型,问题非常迫切,以至于我感到有必要提及sizeof char
不为1的情况(即使它在C之外。请注意,问题标题和问题文本都没有提到C)。 - Mr Lister