【问题标题】:Does sizeof return the number of bytes or the number of octets of a type in C?sizeof 是否返回 C 中某个类型的字节数或八位字节数?
【发布时间】:2012-08-05 18:44:44
【问题描述】:

简单地放入 C 和变体(不像 wuss java 和它的虚拟机),不同目标上的原始类型的大小可能会有很大差异,除非你使用 stdint.h 中定义的固定宽度类型,否则真的无法保证,即便如此,您的实现也必须支持它们。

无论如何假设(因为在大多数现代机器上,一个字节是一个八位字节,出于网络目的,我​​假设(ASCII)) sizeof 是否以字节或八位字节为单位返回数据类型的大小?

【问题讨论】:

  • 字节,但单个字节(表示为char)有CHAR_BITS 位。如果您想要 T 中的八位字节数,请执行 sizeof(T) * CHAR_BITS / 8。在大多数平台上,CHAR_BITS8
  • @GManNickG CHAR_BIT(没有S):)
  • float octetPercent = sizeof(T) * CHAR_BIT /8.0;
  • 请注意,POSIX 和 Windows(即基本上 99.999% 的非 DSP 系统)都需要一个字节作为八位字节,这个问题主要是出于学究/语言律师的目的。
  • 你明白了,这就是它说假设的原因。

标签: c byte sizeof word-size


【解决方案1】:

sizeof 总是以字节数返回大小。但是根据wikipedia

在编程语言 C 和 C++ 中,一元运算符 sizeof 用于计算任何数据类型的大小,以表示该类型所需的字节数来衡量。在这种情况下,字节与无符号字符相同,并且可能大于 8 位,尽管这并不常见

【讨论】:

    【解决方案2】:

    答案:sizeof 返回类型的大小,以字节为单位。


    示例:sizeof(char) 100% 保证为 1,但这并不意味着它是一个八位字节(8 位)。


    通过标准证明:

    在 6.5.3.4 中,第 2 点:

    sizeof 运算符产生其操作数的大小(以字节为单位),这可能是 表达式或类型的括号名称。大小由类型决定 操作数。结果是一个整数。如果操作数的类型是变长数组 类型,计算操作数;否则,不计算操作数,结果为 整数常量。

    ...

    当应用于具有 char、unsigned char 或 signed char 类型的操作数时, (或其合格版本)结果为 1。当应用于具有数组的操作数时 类型,结果是数组中的总字节数)应用于操作数时 具有结构或联合类型,结果是此类对象中的总字节数, 包括内部和尾随填充。

    另外,在第 3.6 节,第 3 点:

    一个字节由一个连续的位序列组成,位的个数由实现定义

    【讨论】:

    • sizeof(char) = 1是什么原因?
    • @ConnorFuhrman 是定义:3.7.1: character: 单字节字符 和对于sizeof: 6.5.3.4 sizeof 操作符: [... ] 当应用于类型为 char、unsigned char 或 signed char(或其限定版本)的操作数时,结果为 1
    【解决方案3】:

    sizeof 以字节为单位给出大小。但是请注意,“字节”是 C 标准中的一个技术术语,其定义为 sizeof(char) == 1

    【讨论】:

      【解决方案4】:

      根据我自己的经验,我在使用奇异的“C”编译器开发嵌入式微控制器时看到了:

      sizeof( uint8 )
      

      返回 1

      sizeof( uint16 )
      

      返回 1

      sizeof( uint32 )
      

      返回 2

      显然,我所处理的机器是最小的可寻址实体是 16 位,所以 sizeof 不符合 C89 或 C99。

      我想说,在主流 C89 和 C99 兼容系统上,公认的答案是正确的。 不幸的是,“C”编译器仍然可以称为“C”编译器,即使它不符合 25 年前的标准。考虑到更多奇特的系统,我希望这个答案有助于正确看待问题。

      【讨论】:

      • 为什么你认为这不符合标准?如果char 是 16 位宽,这正是我所期望的。如果最小的可寻址实体是 16 位,那么 uint8_t 必须占用至少 16 位也是有意义的(因此 sizeof(uint8_t) == sizeof(uint16_t))。
      • 这是一个很好的答案,它揭示了细微差别。带回家:检查CHAR_BIT in <limits.h> 并将其与sizeof(char) 进行比较以供参考。在所有严格的技术情况下,字节都是 8 位,除非(软件说不是)CHAR_BIT 不等于 8。正如C derives its definition for byte from CHAR_BIT. 在你的 16 位最小可寻址大小的情况下,我打赌 CHAR_BIT 设置为 16。你能证实这一点吗?
      猜你喜欢
      • 2011-08-30
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 2011-06-13
      • 2011-06-27
      • 1970-01-01
      • 2013-01-29
      • 2021-07-02
      相关资源
      最近更新 更多