每隔一段时间,就会有人在网上指出char
(aka 'byte') isn't necessarily 8 bits。
看起来8位char
几乎是通用的。我认为对于主流平台,有必要有一个8位的char
,以确保它在市场上的生存能力。
无论是现在还是历史上,哪些平台都使用非8位的char
,为什么它们会与“正常”的8位不同?
在编写代码并考虑跨平台支持(例如,对于通用库)时,对于使用非8位char
的平台,值得考虑哪些因素
在过去,我遇到过一些‘ve公司的DSP,其char
为16位。我认为DSP是一种小众的架构。(话又说回来,当时手工编写的汇编程序轻而易举地击败了现有的C编译器,所以我在那个平台上并没有获得多少使用C的经验。)
发布于 2010-01-20 09:23:00
在德州仪器的C54x DSP上,char
也是16位的,例如在OMAP2中出现的DSP。还有其他具有16位和32位char
的DSP。我想我甚至听说过24位DSP,但我不记得是什么了,所以可能是我想象出来的。
另一个考虑因素是POSIX强制使用CHAR_BIT == 8
。因此,如果您正在使用POSIX,您可以假定它。如果后来有人需要将您的代码移植到POSIX的近似实现中,恰好有您使用的函数,但char
的大小不同,这是他们的厄运。
不过,总的来说,我认为解决这个问题几乎总是比思考它更容易。只需输入CHAR_BIT
即可。如果您想要精确的8位类型,请使用int8_t
。你的代码将在没有提供实现的情况下编译失败,而不是静默地使用你不想要的大小。至少,如果我遇到了一个我有充分理由假设它的案例,那么我会断言它。
发布于 2010-01-20 08:19:40
在编写代码并考虑跨平台支持(例如,对于通用库)时,对于使用非8位字符的平台,值得考虑哪些因素?
与其说它是“值得考虑的”,不如说它是按规则行事的。例如,在C++中,标准规定所有字节都将具有“至少”8位。如果您的代码假设字节恰好有8位,那么您就违反了标准。
现在这可能看起来很愚蠢--“当然,所有的字节都有8位!”,我听到你说。但许多非常聪明的人依赖于不能保证的假设,然后一切都崩溃了。历史上这样的例子比比皆是。
例如,大多数90年代初的开发人员假设,特定的无操作CPU计时延迟占用固定数量的周期将占用固定数量的时钟时间,因为大多数消费者CPU的功率大致相等。不幸的是,计算机变得非常快。这催生了带有"Turbo“按钮的游戏机的兴起--具有讽刺意味的是,它们的目的是降低计算机的速度,以便使用延时技术的游戏可以以合理的速度玩。
一位评论者问道,在标准中,哪里说char必须至少有8位。它在部分。本节定义CHAR_BIT
,即最小可寻址实体中的位数,默认值为8。它还表示:
其实现定义的数值应等于或大于所显示的数值(绝对值),并具有相同的符号。
因此,任何等于或大于8的数字都适合由实现替换到CHAR_BIT
中。
发布于 2010-01-20 08:20:48
具有36位架构的机器有9位字节。根据维基百科,machines with 36-bit architectures包括:
IBM
https://stackoverflow.com/questions/2098149
复制相似问题