在POSIX的基本原理中有一个注意事项,强制要求CHAR_BIT为8,这是一个让步以保持与C99保持一致而不抛弃插座/网络所必需的让步,但我从未见过究竟是什么原因的解释冲突是。有没有人有轶事或引用它为什么被认为是必要的?
编辑:我已经得到了很多关于为什么CHAR_BIT
为8的理由得到的猜测答案,我同意,但我和#39 ;我真的在寻找C99和POSIX中的网络技术之间的技术冲突。我最好的猜测是它与C99有关,要求uint*_t
是精确大小的类型(没有填充),而之前在POSIX中的inttypes.h
没有提出这样的要求。
答案 0 :(得分:11)
因为绝大多数标准(与通信有关)的ANSI和ISO都以八位组(8位值)的方式进行对话。没有任何可疑的可变大小的字符废话: - )
并且,由于相当大量的C代码使用char
或unsigned char
来存储和/或操作这些值,并假设它们是8位宽,因此ISO允许可变大小会导致该代码出现问题。
记住ISO C的一个重要目标 - 现有代码很重要,现有实现则不然。这是limits.h
首先存在而不是仅仅假设特定值的一个原因,因为除此之外还有其他假设的代码。
POSIX也遵循同样的指导方针。通过强制使用8位字节大小,它们可以防止现实世界中已经存在的大量代码中断。
答案 1 :(得分:8)
因为char
是C中最小的可寻址单元,如果你使char
大于8位,那么编写套接字实现将很困难或不可能,正如你所说的那样。网络全部运行在CHAR_BIT == 8
台机器上。那么,如果你要从CHAR_BIT == 9
的机器向CHAR_BIT == 8
的机器发送消息,那么套接字库的附加位是什么?这个问题没有合理的答案。如果你截断这个位,那么很难指定一个简单的东西就像套接字代码的客户端一样简单 - “它是一个char数组,但你只能使用前8位”在这样的系统上是不合理的。而且,从8位系统到9位也会出现同样的问题 - 套接字系统与额外的位有什么关系呢?如果它将该位设置为零,想象一下将int
置于线路上的人会发生什么。你必须在9位机器上做各种令人讨厌的位掩码才能使它正常工作。
最后,由于99.9%的机器使用8位字符,因此并不是那么大的限制。大多数使用CHAR_BIT != 8
的计算机也没有虚拟内存,无论如何都会将它们排除在POSIX兼容性之外。
当你在一台机器上运行时(正如标准C所假设的那样),你可以做一些像CHAR_BIT
不可知的事情,因为可能正在阅读或写入数据的两个方面都在同意正在发生的事情。当您介绍类似套接字的东西时,涉及多台机器,它们必须就字符大小和字节序等内容达成一致。 (尽管如此,Endinanness几乎已经标准化为Big Endian,因为更多的架构在字节序上的区别与字节大小不同)
答案 2 :(得分:1)
我的猜测:
很多代码都经过像
这样的位for (int i = 0; i < 8; i++) { ... }
所有这一切都会破裂。
大多数其他语言无论如何都认为它是8位,如果不是这样,它们就会完全破坏
即使大多数语言不需要这样,大多数ABI仍然会破坏
十六进制(两个半字节)很方便:0xAA
如果你开始走这条路,你就可以开始思考:那么,谁说我们必须使用2状态位?为什么不拥有三态位?等......它开始变得越来越不实用了。