【问题标题】:sizeof and when a byte is larger than 8 bits?sizeof 以及当一个字节大于 8 位时?
【发布时间】:2013-09-05 18:36:40
【问题描述】:
  1. 既然sizeof是一个操作符,为什么我们可以像函数调用一样使用sizeof(something);呢?

  2. 字节何时不是 8 位?

此上下文中的字节与无符号字符相同,并且可能大于 8 位

字节是否有可能小于 8 位?

【问题讨论】:

  • C90,§5.2.4.2.1 需要 CHAR_BIT >= 8

标签: c bit


【解决方案1】:

既然 sizeof 是一个操作符,为什么我们可以使用 sizof(something);像函数调用?

好吧,+ 也是一个“操作员”(原文如此!),您仍然可以编写 (1 + 1)(1) + (1)((1) + 1)... 这只是正常的括号/分组。

当字节不是8位时?

当您使用的平台不是 8 位时。

字节是否有可能小于 8 位?

不适用于旨在成为符合 C 实现的架构。不过,它可能会发生。例如,一些早期的打卡机使用 6 位字节。

【讨论】:

  • 我从 Wiki 上读到这行内容后感到困惑,希望知道字节何时大于 8 位。
  • 一些 DSP C 编译器的字节数超过 8 位 - 这是因为所讨论的 DSP 没有字节寻址,因此字节大小设置为基本字长,例如24 位。
  • @LidongGuo “当它大于 8 位时”到底是什么意思?是时候了。当你使用这样的架构时。
  • @H2CO3 我们现在真的有这种架构吗?
  • @H2CO3 最新的尖端(大多数非公开)微控制器有时不使用 8 位字节(例如 4 或 16)来使电路更简单,因此芯片更小更便宜。尽管制造商通常不会为 C 编译器而烦恼,因此您必须立即在 ASM 中进行编程(如果您是必须编写该东西的人,那就太糟糕了),但是存在很多。大多数情况下,我只看到控制器中小型 EEPROM 单元的 16 位访问;或 4 位,用于补充片上模块,如 LIN 控制器。
【解决方案2】:

像大多数运算符一样,sizeof 可以应用于可以包含括号的表达式。就解析器而言,它与x * (b + c) 几乎相同,其中* 适用于(b + c)。虽然你不经常看到它,但像 x + (b) 这样的东西也是完全可能的。

标准规定CHAR_MIN 不得高于-127,CHAR_MAX 必须至少为 127。这需要至少 8 位来表示,所以不,char 不能小于 8 位.

【讨论】:

  • 字节何时会大于 8 位?
  • @LidongGuo:当实施者决定应该这样做时。鉴于 UTF-8 的流行,我不确定它是否会变得普遍。
  • 使char 大于 8 位与字符编码无关。它与无法寻址或在 8 位单元上运行的机器有关——通常是只有单一大小的内存访问单元的 DSP,通常是 32 位或 64 位。
  • @R..:它在一定程度上影响 CPU 设计人员他们可以寻址的项目的大小。只要人们继续使用 8 位数量,大多数机器都会继续支持它们。如果每个人都开始使用 UTF-16,那么以 16 位字节工作的机器的几率会更高。
  • 不,真的不会。您仍然需要CHAR_BIT==8 来支持所有现有的二进制数据文件、网络协议等。文本只是问题的一小部分。
【解决方案3】:
  1. 既然 sizeof 是一个操作符,为什么我们可以使用 sizof(something);像函数调用?

    其他人回答了这个问题,但我还是会回答。 ~ 是一个运算符,那为什么我们可以用~(a) 而不是~a 呢?虽然根本不同,但它们在语法方面仍然相似。例外是你可以做sizeof(int),但这是因为sizeof 做了什么,它被扩展为一个编译时常量。

  2. 当字节不是 8 位时?

     

    此上下文中的字节与无符号字符相同,可能大于 8 位

    某些平台有 9 位字节。 C 标准要求每个字符至少 8 位。目前,许多系统使用 8 位字节,也就是“八位字节”。

    在像 Java 这样的语言中,char 不是 8 位的,因此 C 的实现可以用同样的方式轻松定义它。如果没有位掩码和位移位或位字段,您将无法使用标准 C 语法访问更少量的数据,因为像 short int 这样的其他数据类型是根据 char 定义的:

    存储在任何其他对象类型的非位域对象中的值由 n × CHAR_BIT 位组成,其中 n 是大小该类型的对象,以字节为单位。

    所以如果sizeof(short int) 是2,它将有2 × CHAR_BIT 位。如果 CHAR_BIT 是 16,则 short int 是 32 位整数类型。

【讨论】:

    【解决方案4】:

    计算机科学对字节的定义有所不同。这是8位。而 C 的定义是 byte 是 char 类型的位数。由于几乎总是相同的,因此它们被视为平等是很常见的。

    【讨论】:

      【解决方案5】:
      1. 是的。
      2. 怀疑您有一台字节不是 8 位的机器。无论如何, sizeof() 需要一个类型。 “字节”不是一种类型。类型类似于“char”“short”“int”。在 C 中,最小的类型是一个字节的 char。也许我应该说“可能是一个字节”。

      【讨论】:

      • 其实sizeof 没有“取类型”。它需要一个表达式,看起来像一个演员表。但最好在对象上使用sizeof,比如int *nums = malloc(3 * sizeof *nums);等。
      • @unwind 写sizeof(int)的时候,sizeof的参数不就是一个类型吗?还是实际上是sizeof <the big nothing cast to int>
      • sizeof() 采用表达式或类型名称。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-26
      • 2012-11-16
      • 2012-08-21
      • 2021-01-09
      • 2011-06-17
      • 2023-02-24
      • 1970-01-01
      相关资源
      最近更新 更多