1字节!= 8位的系统?

时间:2011-04-01 16:16:13

标签: c++ c byte history computer-architecture

我一直读到像

这样的句子
  

不要依赖大小为8位的1字节

     

使用CHAR_BIT而不是8作为常量来转换位和字节

等等。今天有什么现实生活系统,这是真的吗? (我不确定C和C ++之间是否存在差异,或者它是否与语言无关。如果需要,请重新加入。)

9 个答案:

答案 0 :(得分:65)

在较旧的机器上,小于8位的代码相当普遍,但大多数代码已经死了多年并且已经消失了。

C和C ++规定char最小为8位,至少可以追溯到C89标准。 [编辑:例如,C90,§5.2.4.2.1要求CHAR_BIT> = 8且UCHAR_MAX> = 255. C89使用不同的部分编号(我相信那将是§2.2.4.2.1)但相同的内容]。它们将“char”和“byte”视为基本同义[编辑:例如,CHAR_BIT被描述为:“不是位域(字节)的最小对象的位数”。]

然而,当前的机器(主要是DSP)中最小的类型大于8位 - 最少12,14甚至16位是相当普遍的。 Windows CE大致相同:它的最小类型(至少使用Microsoft的编译器)是16位。它们但是,将char视为16位 - 而是采用(不符合)方法,根本不支持名为char的类型。

答案 1 :(得分:23)

今天,在x86处理器上的C ++世界中,依赖一个8位的字节是非常安全的。字大小不是2(8,16,32,64)的幂的处理器非常不常见

它并非总是如此。

Control Data 6600(及其兄弟)中央处理器使用60位字,一次只能寻址一个字。从某种意义上说,CDC 6600上的“字节”是60位。

DEC-10字节指针硬件使用任意大小的字节。字节指针包括以位为单位的字节大小。我不记得字节是否可以跨越字边界;我认为它们不能,这意味着如果字节大小不是3,4,9或18位,那么每个字会有一些浪费位。 (DEC-10使用了36位字。)

答案 2 :(得分:14)

除非您编写的代码可能对DSP有用,否则您完全有权假设字节为8位。全世界可能都不是VAX(或英特尔),但全世界都必须进行通信,共享数据,建立通用协议等等。我们生活在基于八位字节构建的协议的互联网时代,任何字节不是八位字节的C实现都将很难使用这些协议。

值得注意的是POSIX和Windows都有(并且要求)8位字节。这涵盖了100%有趣的非嵌入式机器,而且现在也有很大一部分非DSP嵌入式系统。

答案 3 :(得分:7)

来自Wikipedia

  

首先是一个字节的大小   被选为现有的倍数   电传打字机代码,特别是   美国陆军使用的6位代码   (Fieldata)和海军。 1963年,结束   使用不兼容的电传打字机   不同分支的代码   美国政府,ASCII,一个7位代码,   被采纳为联邦信息   加工标准,制作6位   字节商业上已过时。在里面   20世纪60年代初,AT& T推出数字化   电话首先在长途干线上   线。这些使用了8位μ律   编码。这笔巨额投资   承诺降低传输成本   对于8位数据。使用8位代码   对于数字电话也造成了影响   要采用的8位数据“八位字节”   早期的基本数据单元   因特网。

答案 4 :(得分:6)

作为主流平台上的普通程序员,你需要过多担心一个字节不是8位。但是,我仍然在我的代码中使用CHAR_BIT常量,并且assert(或更好static_assert)在任何依赖8位字节的位置。这应该让你安全。

(我不知道任何相关的平台并不成立)。

答案 5 :(得分:5)

首先,char中的位数不正式依赖于“系统”或“机器”,即使这种依赖性通常隐含在常识中。 char中的位数仅取决于实现(即在编译器上)。对于任何“普通”系统或机器,在char中实现编程器的位数超过8位都没有问题。

其次,有几个嵌入式平台sizeof(char) == sizeof(short) == sizeof(int),每个都有16位(我不记得这些平台的确切名称)。此外,众所周知的Cray机器具有类似的属性,所有这些类型都有32位。

答案 6 :(得分:2)

在历史上,存在一堆奇怪的架构,其中不使用8的倍数的本机字大小。如果您今天遇到任何这些,请告诉我。

  

历史上字节的大小   是硬件依赖,没有   存在明确的标准   要求规模。

如果你做了很多嵌入式的东西,记住它可能是一件好事。

答案 7 :(得分:1)

我做了大量的嵌入式工作,目前正致力于使用CHAR_BIT为16的DSP代码

答案 8 :(得分:1)

HP Saturn上的维基百科条目中添加一个作为参考:

  

土星架构是以蚕食为主;也就是说,数据的核心单位是4位,可以保存一个二进制编码的十进制(BCD)数字。