1字节!= 8位的系统?
所有的时候我都像读一样的句子
不要依靠8位大小的1个字节
使用
CHAR_BIT
而不是8作为常量来转换位和字节
等等。 今天有什么真正的生活系统,这是真实的吗? (我不确定C和C ++之间是否存在差异,或者实际上是否与语言无关,如果需要请重新标记)
在较老的机器上,小于8位的代码是相当常见的,但其中大部分已经死了多年。
C和C ++已经规定char
至less8位,至less早在C89标准的时候。 [编辑:例如,C90,§5.2.4.2.1需要CHAR_BIT
> = 8和UCHAR_MAX
> = UCHAR_MAX
使用不同的节号(我相信这将是§2.2.4.2.1),但内容相同]。 他们把“char”和“byte”视为基本同义[编辑:例如, CHAR_BIT
被描述为:“不是位域(字节)”的最小对象的位数。]
然而,目前的机器(主要是DSP)的最小types大于8位,最less12,14甚至16位是相当普遍的。 Windows CE大致相同:最小的types(至less在微软的编译器中)是16位。 但是,他们不把char
视为16位,而是采取(不符合)的方式,根本不支持名为char
的types。
如今,在x86处理器上的C ++世界中,依靠8位的一个字节是相当安全的。 字大小不是2的幂(8,16,32,64)的处理器是非常罕见的 。
它并不总是如此。
控制数据6600(及其兄弟)中央处理器使用一个60位字,并且一次只能处理一个字。 在某种意义上,CDC 6600上的“字节”是60位。
DEC-10字节指针硬件使用任意大小的字节。 字节指针包含字节大小的位。 我不记得字节是否可以跨越单词边界; 我认为他们不能这样做,这意味着如果字节大小不是3,4,9或18位,那么每个字都会有一些浪费。 (DEC-10使用了一个36位字。)
除非您正在编写可能对DSP有用的代码,否则您完全有权假定字节是8位。 全世界都可能不是VAX(或英特尔),但是全世界都必须进行通信,共享数据,build立通用协议等等。 我们生活在build立在八位字节上的协议上的互联网时代,任何字节不是八位字节的C实现都将很难使用这些协议。
还值得注意的是,POSIX和Windows都有(和强制)8位字节。 这涵盖了100%有趣的非embedded式机器,以及当今大部分非DSPembedded式系统。
维基百科 :
一个字节的大小最初被select为现有电传打字机代码的倍数,特别是美国陆军(Fieldata)和海军使用的6位代码。 1963年,为了结束美国政府不同部门使用的不兼容的电传打字机代码,一种7位代码ASCII被采纳为联邦信息处理标准,使得6位字节在商业上被淘汰。 在二十世纪六十年代初期,AT&T首先在长途干线上引入数字电话。 这些使用了8位μ律编码。 这一大笔投资有望降低8位数据的传输成本。 数字电话使用8位码也导致8位数据“八比特组”被用作早期因特网的基本数据单元。
首先, char
中的位数不正式依赖于“系统”或“机器”,即使这种依赖性通常是由常识暗示的。 char
的位数只取决于实现 (即在编译器上)。 对于任何“普通”系统或机器来说,实现一个编译器的char
数超过8位是没有问题的。
其次,有几个embedded式平台,其中每个都有16位(我不记得这些平台的确切名称sizeof(char) == sizeof(short) == sizeof(int)
, sizeof(char) == sizeof(short) == sizeof(int)
)。 而且,众所周知的Cray机具有类似的性质,其中所有这些types都具有32位。
作为主stream平台上的普通程序员,你不必太担心一个字节不是8位。 然而,我仍然在我的代码中使用CHAR_BIT
常量,并assert
(或更好的static_assert
)任何地方,你依靠8位字节。 这应该把你放在安全的一面。
(我不知道任何相关的平台,如果不是这样的话)。
在历史上,有一些奇怪的架构,不使用8的倍数原生字大小。如果你今天遇到任何这些,让我知道。
- 英特尔的第一个商用CPU是英特尔4004 (4位)
- PDP-8 (12位)
字节的大小在历史上与硬件有关,并且不存在规定大小的确定性标准。
如果你做了很多embedded的东西,那么记住它可能是一件好事。
我做了很多embedded式操作,目前正在处理CHAR_BIT为16的DSP代码
在HP Saturn上的维基百科条目中添加一个作为参考:
土星build筑是基于蚕食的; 即数据的核心单元是4位,可以保存一个二进制编码的十进制(BCD)数字。