告诉我标准如何规定字节的大小?
我在某处听说C有一个约定,一个字节只能是 8 位。但我找不到来源。
许多人习惯于使用char和CHAR_BIT对字节进行操作,但char不仅是 8 位的。
CHAR_BIT也具有误导性,因为这个宏常量似乎与字节的大小无关,它指的是char类型的位数。
通常需要通过void*逐个字节地浏览内存/对象。有人为此使用强制转换为char*,但这显然是错误的。例如,我对uint8_t*使用强制转换,但这可能也是错误的。
告诉我标准如何规定字节的大小?
我在某处听说C有一个约定,一个字节只能是 8 位。但我找不到来源。
许多人习惯于使用char和CHAR_BIT对字节进行操作,但char不仅是 8 位的。
CHAR_BIT也具有误导性,因为这个宏常量似乎与字节的大小无关,它指的是char类型的位数。
通常需要通过void*逐个字节地浏览内存/对象。有人为此使用强制转换为char*,但这显然是错误的。例如,我对uint8_t*使用强制转换,但这可能也是错误的。
我在 C 中的任何地方都没有看到每字节 8 位的约定。但是让我们打开c11标准——这当然不是标准本身,而是一个非常接近它的文档。
第 6.2.6 节类型的表示给出了以下内容
这里它有点含蓄地说
n × CHAR_BIT bits== n 个字节。也就是说,CHAR_BIT位是一个字节。同时,第 3.6 段说
也就是说,一个字节足以容纳任何字符类型。唔...
字节必须有一个唯一的地址
就是这样 - 位数由实现决定。
条款 5.2.4.2 数值限制表明 CHAR_BIT 至少为 8 或更大。
该怎么办?将 CHAR_BIT == 8 检查添加到构建系统并轻松睡眠:平台很可能是 x86/64,您可以使用
void*andchar, 'memcpy'/'memmove' 函数,一切都会工作。但是当条件不起作用时,您就会开始恐慌并要求编译器提供文档。
这里他们说它不能是八位的