92

我一直在读类似的句子

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

使用CHAR_BIT而不是 8 作为常量在位和字节之间进行转换

等等。今天有哪些现实生活系统,这在哪里适用? (我不确定 C 和 C++ 之间在这方面是否存在差异,或者它是否实际上与语言无关。如有必要,请重新标记。)

4

9 回答 9

75

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

C 和 C++ 已规定至少8 位char,至少早在 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将 a视为 16 位——相反,它们采用了(不符合标准的)方法,即根本不支持命名的类型char

于 2011-04-01T16:27:13.130 回答
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 位字。)

于 2011-04-01T16:22:59.940 回答
14

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

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

于 2011-09-08T02:23:23.227 回答
7

来自维基百科

一个字节的大小最初被选择为现有电传打字机代码的倍数,特别是美国陆军 (Fieldata) 和海军使用的 6 位代码。1963 年,为了结束美国政府不同部门使用不兼容的电传打印机代码,7 位代码 ASCII 被采用为联邦信息处理标准,使 6 位字节在商业上已经过时。在 1960 年代初期,AT&T 首先在长途干线上引入了数字电话。这些使用 8 位 µ-law 编码。这笔巨额投资有望降低 8 位数据的传输成本。数字电话使用 8 位代码也导致采用 8 位数据“八位字节”作为早期 Internet 的基本数据单元。

于 2011-04-01T16:20:14.843 回答
6

作为主流平台的普通程序员,不用太担心一个字节不是8位。但是,我仍然会在我的代码和(或更好)您依赖 8 位字节的任何位置中使用该CHAR_BIT常量。那应该让你安全。assertstatic_assert

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

于 2011-04-01T16:20:13.023 回答
4

首先,in 的位数char并不正式取决于“系统”或“机器”,尽管这种依赖性通常是常识所暗示的。中的位数char仅取决于实现(即编译器)。char对于任何“普通”系统或机器,实现一个超过 8 位的编译器是没有问题的。

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

于 2011-06-19T15:56:36.113 回答
2

我做了很多嵌入式,目前正在处理 CHAR_BIT 为 16 的 DSP 代码

于 2011-04-01T16:25:09.673 回答
2

在历史上,存在着一堆奇怪的架构,它们不使用原生字长,而是 8 的倍数。如果你今天遇到任何这些,请告诉我。

字节的大小历来取决于硬件,并且不存在强制该大小的明确标准。

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

于 2011-04-01T16:35:07.560 回答
1

再添加一个作为参考,来自HP Saturn的 Wikipedia 条目:

Saturn 架构是基于半字节的;即数据的核心单位是4位,可以容纳一个二进制编码的十进制(BCD)位。

于 2013-09-11T14:11:05.390 回答