我一直读到像
这样的句子不要依赖大小为8位的1字节
使用
CHAR_BIT
而不是8作为常量来转换位和字节
等等。今天有什么现实生活系统,这是真的吗? (我不确定C和C ++之间是否存在差异,或者它是否与语言无关。如果需要,请重新加入。)
答案 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
被描述为:“不是位域(字节)的最小对象的位数”。]
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)数字。