Cra*_*een 133 c c++ cross-platform
不时有人在SO上指出char(也就是"字节")不一定是8位.
似乎8位char几乎是通用的.我原本认为,对于主流平台,必须有一个8位char才能确保其在市场上的可行性.
现在和历史上,哪些平台使用的char不是8位,为什么它们与"普通"8位不同?
在编写代码时,考虑跨平台支持(例如,对于通用库而言),对于非8位平台,值得考虑的是什么char?
在过去,我遇到过一些char16位的ADI DSP .我认为DSP是一种利基架构.(然后,当时手工编写的汇编程序很容易击败可用的C编译器可以做的事情,所以我在该平台上没有真正获得C的经验.)
Ste*_*sop 77
char is also 16 bit on the Texas Instruments C54x DSPs, which turned up for example in OMAP2. There are other DSPs out there with 16 and 32 bit char. I think I even heard about a 24-bit DSP, but I can't remember what, so maybe I imagined it.
Another consideration is that POSIX mandates CHAR_BIT == 8. So if you're using POSIX you can assume it. If someone later needs to port your code to a near-implementation of POSIX, that just so happens to have the functions you use but a different size char, that's their bad luck.
但总的来说,我认为解决这个问题几乎总是比思考它更容易.只需输入CHAR_BIT.如果你想要一个精确的8位类型,请使用int8_t.你的代码将无法在没有提供代码的实现上编译,而不是默默地使用你没想到的大小.至少,如果我遇到一个我有充分理由认为它的情况,那么我就断言它.
Joh*_*lla 36
在编写代码并考虑跨平台支持时(例如对于通用库而言),对于具有非8位字符的平台,值得考虑的是什么?
并不是因为规则所扮演的东西"值得考虑".例如,在C++中,标准规定所有字节都将具有"至少"8位.如果您的代码假设字节恰好是8位,则表示您违反了标准.
这看起来似乎很愚蠢 - " 当然所有字节都有8位!",我听到你说.但是许多非常聪明的人依赖于不是保证的假设,然后一切都破裂了.历史充满了这样的例子.
例如,大多数早期的90年代开发人员认为,采用固定数量的周期的特定无操作CPU定时延迟将花费固定的时钟时间,因为大多数消费者CPU的功率大致相等.不幸的是,计算机变得非常快.这产生了带有"Turbo"按钮的盒子的兴起 - 具有讽刺意味的是,它的目的是减慢计算机速度,以便使用延时技术的游戏可以以合理的速度播放.
一位评论者询问标准中的哪个字母表示char必须至少有8位.它在5.2.4.2.1节中.本节定义CHAR_BIT了最小可寻址实体中的位数,默认值为8.它还说:
它们的实现定义值的大小(绝对值)应等于或大于显示的值,并带有相同的符号.
所以任何等于8或更高的数字都适合用于实现的替换CHAR_BIT.
R S*_*hko 31
具有36位体系结构的计算机具有9位字节.据维基百科称,具有36位架构的机器包括:
Jer*_*fin 18
其中一些我知道:
Ell*_*ioh 15
没有完全可移植的代码.:-)
是的,可能有各种字节/字符大小.是的,对于具有非常不寻常的值CHAR_BIT和的平台,可能存在C/C++实现UCHAR_MAX.是的,有时可以编写不依赖于字符大小的代码.
但是,几乎所有实际代码都不是独立的.例如,您可能正在编写将二进制消息发送到网络的代码(协议并不重要).您可以定义包含必要字段的结构.比你必须序列化它.只是将结构二进制复制到输出缓冲区是不可移植的:通常你不知道平台的字节顺序,也不知道结构成员对齐,所以结构只保存数据,但没有描述数据应该序列化的方式.
好.您可以执行字节顺序转换并将结构成员(例如uint32_t或类似)移动memcpy到缓冲区中.为什么memcpy?因为有很多平台在目标地址未正确对齐时无法写入32位(16位,64位 - 无差异).
所以,你已经做了很多工作来实现可移植性.
现在是最后一个问题.我们有一个缓冲区.来自它的数据被发送到TCP/IP网络.这种网络假定为8位字节.问题是:缓冲区应该是什么类型的?如果你的字符是9位?如果他们是16位?24?也许每个char对应一个发送到网络的8位字节,只使用8位?或者也许多个网络字节被打包成24/16/9位字符?这是一个问题,很难相信有一个适合所有情况的答案.很多事情都依赖于目标平台的套接字实现.
所以,我在说什么.通常,代码可以相对容易地在一定程度上便携.如果您希望在不同平台上使用代码,那么这样做非常重要.但是,提高超出该度量的可移植性需要付出很多努力并且通常很少,因为实际代码几乎总是依赖于其他代码(上例中的套接字实现).我确信,大约90%的代码能够在具有8位以外字节的平台上工作几乎是无用的,因为它使用绑定到8位的环境.只需检查字节大小并执行编译时断言.你几乎肯定会为一个非常不寻常的平台重写很多东西.
但如果您的代码高度"独立" - 为什么不呢?您可以以允许不同字节大小的方式编写它.
例如,C和C++编程语言将字节定义为"足够大的可寻址数据单元,以容纳执行环境的基本字符集的任何成员"(C标准的第3.6节).由于C char整数数据类型必须至少包含8位(第5.2.4.2.1节),因此C中的一个字节至少能够保存256个不同的值.C和C++的各种实现将字节定义为8,9,16,32或36位
引自http://en.wikipedia.org/wiki/Byte#History
虽然不确定其他语言.
http://en.wikipedia.org/wiki/IBM_7030_Stretch#Data_Formats
将该计算机上的字节定义为可变长度