为什么POSIX要求CHAR_BIT == 8?

时间:2011-07-08 23:12:53

标签: c posix

在POSIX的基本原理中有一个注意事项,强制要求CHAR_BIT为8,这是一个让步以保持与C99保持一致而不抛弃插座/网络所必需的让步,但我从未见过究竟是什么原因的解释冲突是。有没有人有轶事或引用它为什么被认为是必要的?

编辑:我已经得到了很多关于为什么CHAR_BIT为8的理由得到的猜测答案,我同意,但我和#39 ;我真的在寻找C99和POSIX中的网络技术之间的技术冲突。我最好的猜测是它与C99有关,要求uint*_t是精确大小的类型(没有填充),而之前在POSIX中的inttypes.h没有提出这样的要求。

3 个答案:

答案 0 :(得分:11)

因为绝大多数标准(与通信有关)的ANSI和ISO都以八位组(8位值)的方式进行对话。没有任何可疑的可变大小的字符废话: - )

并且,由于相当大量的C代码使用charunsigned 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状态位?为什么不拥有三态位?等......它开始变得越来越不实用了。