可移植代码 - 每个字符的位数

Posted

技术标签:

【中文标题】可移植代码 - 每个字符的位数【英文标题】:Portable code - bits per char 【发布时间】:2012-07-20 23:18:56 【问题描述】:

我知道 C/C++ 标准只保证每个字符最少位 8 位,理论上 9/16/42/其他任何东西都是可能的,因此所有关于编写可移植性的网站代码警告不要假设 8bpc。我的问题是这到底有多“不便携”?

让我解释一下。在我看来,系统分为 3 类:

    计算机 - 我指的是运行 Mac/Linux/Windows/Unix/*nix/posix/whatever 的台式机、笔记本电脑、服务器等(我知道这个列表并不完全正确,但你明白了)。听到char 不是完全 8 位的任何此类系统,我会感到非常惊讶。 (如有错误请指正) 带有操作系统的设备 - 这包括智能手机和此类嵌入式系统。虽然我不会对char 超过 8 位这样的系统感到惊讶,但迄今为止我还没有听说过(如果我不知道,请再次通知我) 裸机 - 录像机、微波炉、旧手机等。在这个领域我没有半点经验,所以在这里什么都有可能发生。但是,我真的需要我的代码在我的 Windows 桌面和微波炉之间跨平台吗?我是否有可能拥有两者共有的代码?

底线:是否有常见的(超过 %0.001)平台(在上面的类别 1 和 2 中)char 不是 8 位?我的上述猜测是真的吗?

【问题讨论】:

@tbert sizeof(char) 始终为 1。它不是 bits 中的大小,而是 chars 中的大小 不,它是类型的大小,以 bytes 为单位,您可以从中得出位数。 POSIX 需要 char=8bits。 OTOH,一些广泛使用的 DSP 具有 16 位或 32 位字符,例如一些 TI 在许多 ARM 平台上使用的。您的智能手机可能有一个。 另见:***.com/questions/2098149/… 您关于裸机设备的 cmets 似乎基于您计划执行的特定编码。您要求我们验证您的假设,而没有告诉我们它们的依据。例如,如果您编写低级计算库或数据传输代码,它很有可能在未来的裸机设备上运行。如果你写 GUI 程序,也许不会。 【参考方案1】:

至少,类似于 64 位架构中的整数大小,未来的平台可能会使用更宽的字符,具有更多的位。 ASCII 字符可能会过时,取而代之的是 unicode。这可能是一个原因,所以要小心。

【讨论】:

这其实是一个反例。为了不破坏所有依赖 int 为 32 位的代码,我认为所有常见的编译器即使在 64 位系统上也将 int 保留为 32 位。 @baruch,我同意他们目前这样做,但是,谁知道多久。【参考方案2】:

使用限制.h

CHAR_BIT

http://www.cplusplus.com/reference/clibrary/climits/

另外,当您想使用给定的大小时,请使用 stdint.h

【讨论】:

我推荐这个 :-) #if (CHAR_BIT != 8) #error 你很奇怪,走开! #endif 我想知道我是否可以编写假设char 是8 位的代码,而不是如何找到char 中的位数 @baruch,也许吧。你关心?如果你想将 32 位打包成一个无符号整数,并且你正在做位旋转,或者使用 memcpy、memset,那么是的,你可能会关心。所以在这种情况下,使用 stdint.h 类型。如果您将值传递给函数,或者在您只想使用本机 int 类型(或无符号)的地方做其他事情,那么您可能不在乎。任何时候你真的很在意,然后我会在某个地方放置一个预处理器守卫,它要么警告用户他们正在进入无人区,要么通过提供两种不同的实现来解决问题。 @baruch,序列化也是需要小心的地方。 @baruch,对于这些问题,请尽可能依赖您的编译器供应商及其标准实现。他们已经为您完成了大部分困难的部分。此外,如果您确实关心一个字节中的位数,那么我认为不可能编写 100% 可移植的代码。在这种情况下,您可能需要编写两个实现来处理两者之间的任何差异。这将比尝试编写一些只有一半代码将在给定平台上运行的复杂混乱更容易、更快、更好。【参考方案3】:

例如,许多DSP 的CHAR_BIT 大于或等于16。

【讨论】:

在我的问题中这些不属于第 3 类吗? @baruch:不是真的,它们中的许多是具有“传统” CPU 和操作系统的更大系统的一部分。【参考方案4】:

您通常可以安全地假设文件将具有 8 位字节,或者如果不是,则可以通过常用工具将 8 位字节文件转换为零填充的本机格式。但是假设 CHAR_BIT == 8 会更加危险。目前几乎总是如此,但将来可能并非总是如此。 8 位访问内存越来越成为瓶颈。

【讨论】:

如果我们都假设 CHAR_BIT 等于 8,那么未来的处理器将永远无法在市场上立足,因为当我们将程序编译到这些处理器上时,我们的程序将无法运行。因此,CHAR_BIT 将始终等于 8。哈哈? (其实这让我很郁闷)

以上是关于可移植代码 - 每个字符的位数的主要内容,如果未能解决你的问题,请参考以下文章

安全、可移植的加密配置值——可能吗?

如何在 Python 3 中腌制和取消腌制到可移植字符串

可移植性

在字符串中构建一个 shell 命令,以便以后可移植地执行

代码的可移植可复用性

如果我以可移植性为目标,我应该对具有负值的字符使用带符号的字符吗?