【问题标题】:Bits, bytes, character, and integer sizes in CC 中的位、字节、字符和整数大小
【发布时间】:2018-03-14 03:41:20
【问题描述】:

根据我在 stackoverflow 上搜索和发现的内容,我发现一个字符始终是 1 个字节。这是肯定的。但是,我也看到它可能不是 8 位(它可能更大,参见 CHAR_BITS)。这是否意味着如果在某些假设的架构中是 10 位,那么 1 字节 = 10 位?这是否意味着如果实现默认整数为 4 个字节,那么 int 的大小将为 40 位?尽管 Internet 上的线程数量惊人,但我对所有这些位字节的变化感到有些怀疑。

【问题讨论】:

  • 为什么知道“字节”/char 是否为 8、9、16 等位很重要?通常该问题的答案指出位宽并不重要,但 type 很重要。如果代码需要 8 位,请使用 (u)int8_t。如果代码需要32位,使用(u)int32_t,如果代码至少需要32位,使用(u)int_least32_t.long等。如果代码需要知道int的范围,使用INT_MIN/INT_MAX
  • 与其说是“为什么重要”的问题,不如说是在我继续前进之前真正理解一切的问题,我的强迫症阻止我这样做。但是,是的,我明白为什么我可以简单地使用这些 typedef。根据我现在的理解,C 标准将“字节”视为字符大小的东西。现在按照惯例,这可能是 8 位,但也可能更多。无论如何,为了术语,C 将此大小计为一个字节,而通常我们将一个字节定义为 8 位。希望我明白了。
  • BITD, C 在各种架构中开创了一个中间地带。将一个公司的正常“字节”和另一个平台的不同大小的“字节”取为“字节”/char至少8位,取决于平台,是最小的单位。这种创新产生了遵循松散定义的可移植代码。今天,市场可接受的架构越来越紧缩。如果想要非常严格的编码定义,C 不是最佳选择。如果一个人想要一种能够适应创新但又不超越过去的语言,那么 C - warts (many) and all - 是一个长期的好选择。

标签: c byte bit primitive


【解决方案1】:

对于现代平台,这些大小是可预测的,byte 是 8 位,int 是 4 或 8 个字节,依此类推。 “字节”的定义和实现不太可能改变,因为它的这个版本结合了 1970 年代引入的 8 位 CPU,这可以说导致 ASCII 战胜竞争标准。它已经变得如此根深蒂固,以至于有些语言按字面意思对待它:在法语中,“字节”一词是“八位字节”。

对于历史平台,所有赌注都已取消。有些使用 10、12、18 或 36 位整数。早期的计算机根本不使用字节,而是使用任意大小的words。事物由这些单元组成,其中“双字”值可能是 48 位,无论出于何种原因。这是一个时代,一个比特可能由多个真空管或全尺寸晶体管表示,因此实际成本问题导致一些非常不寻常的设计。

现在说到字符,它们不一定是一个字节。在UNICODE 中,它们可能远不止于此,尤其是当表示为 UTF-8、UTF-16 或 UTF-32 时,这类文本的常见编码方法。只有在像 Latin1 这样的 8 位编码中,字符和字节才能互换。

重要的是要考虑到,虽然大多数消费类 CPU 的尺寸都非常均匀,但在处理 DSP 或定制 FPGA 处理器等专用设备时,这一切都消失了。

好消息是,您不太可能在围绕异常寄存器大小构建的 DSP 或定制 FPGA 处理器上进行字符处理。这些通常专注于处理一些其他类型的数字数据。

【讨论】:

  • ASCII 是 7 位。一些最初的 C 计算机有 9 位“字节”,因为字长 36 不能被 7 整除,但 9 可以。我想没有一个架构可以支持 C 的实际 7 位可寻址字节。
  • @AnttiHaapala 你说得对,ASCII 是一个 7 位标准,但它通常以 8 位存储,其中高 128 个字符留给供应商用于各种目的,通常用于图形字符或重音字母变体。我的意思是 ASCII,以及由 IBM PC 推广的 8 位“ANSI”集,而不是 EBCDIC 或其他创建字符标准的尝试。
猜你喜欢
  • 1970-01-01
  • 2010-10-16
  • 1970-01-01
  • 2020-08-18
  • 2013-05-01
  • 1970-01-01
  • 2017-01-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多