【问题标题】:size guarantee for integral/arithmetic types in C and C++C 和 C++ 中整数/算术类型的大小保证
【发布时间】:2010-11-03 21:23:27
【问题描述】:

我知道 C++ 标准明确保证只有 charsigned charunsigned char 的大小。它还保证short 至少和char 一样大,intshort 一样大等等。但是没有明确保证sizeof(int) 的绝对值。这是我脑海中的信息,我快乐地生活在它身上。然而,前段时间,我在 SO(找不到)中看到一条评论,在 C 中 long 保证至少为 4 个字节,并且该要求由 C++“继承”。是这样吗?如果是这样,我们对 C++ 中算术类型的大小还有哪些其他隐含保证?请注意,我对这个问题中跨不同平台的实际保证绝对不感兴趣,只是理论保证。

【问题讨论】:

  • "在网上某处,有人说了什么,我读到了,但现在找不到了,我也不确定它到底是什么,我忘记了它是什么事实基于 (if 它是基于任何) 以及它的推理是什么。但是,请你对它的推理提出异议并确认或否认它吗?里面藏着一个埃里温广播电台的笑话,但现在我已经刺了它 5 分钟,它很害怕,不会从它的藏身之处出来。 :)
  • @sbi:哦,拜托,你在夸大其词:)。顺便说一句,我 am 来自埃里温 :)
  • 在 C 中,绝对不能保证 long 至少有 4 个字节宽。这当然也适用于 C++。但是,long 总是 sizeof long 字节。
  • @eq-: 不能保证 long 必须至少为 4 字节宽,但它确实暗示它必须根据最小范围至少为 32 位宽给。这几乎总是意味着 4 个字节,因为在大多数(但不是全部!)架构上一个字节是 8 位。
  • @In silico:是的,我很迂腐。然而,如今 long 绝不意味着 [原文如此] 4 字节 - 在 64 位 *NIX 操作系统中拥有 64 位长度是很常见的(可以说事实上)。

标签: c++ c sizeof primitive-types


【解决方案1】:

18.2.2 保证 <climits> 与 C 库头 <limits.h> 具有相同的内容。

ISO C90 标准很难掌握,考虑到 C++ 依赖它,这是一种耻辱,但是“数值限制”部分(在我有一次追踪的随机草案中编号为 2.2.4.2 并且撒了谎) around) 给出了<limits.h>INT_MAX 等常量的最小值。例如ULONG_MAX必须至少为4294967295,由此推断long的宽度至少为32位。

C99 标准中也有类似的限制,但当然不是 C++03 引用的限制。

保证long至少有4个字节,因为在C和C++中“字节”基本上被定义为“字符”,不能保证CHAR_BIT在 C 或 C++ 中为 8。 CHAR_BIT == 8 由 POSIX 和 Windows 保证。

【讨论】:

  • 谢谢!我会接受这个答案,因为它涵盖了所有方面。我也感谢所有其他答案,因为它们都带有有价值的信息。
  • 根据pmg的帖子,CHAR_BIT >= 8是有保证的。你也这么理解吗?
  • @Mark:是的,这个限制也在我的 C89 草案中(同一部分)。它肯定在 C99 (5.2.4.2.1/1) 中,物有所值。我真的应该得到一份值得信赖的 C89 或 C90 副本,但上次我真的需要一个,我们办公室里有一个。
【解决方案2】:

不了解 C++。在 C 中你有

附件 E (资料性的) 实施限制 [#1] 标题的内容如下, 按字母顺序。所示的最小幅度应 被实现定义的幅度替换为 相同的标志。这些值都应为常量表达式 适合在#if 预处理指令中使用。这 组件在 5.2.4.2.1 中进一步描述。 #define CHAR_BIT 8 #define CHAR_MAX UCHAR_MAX 或 SCHAR_MAX #define CHAR_MIN 0 或 SCHAR_MIN #define INT_MAX +32767 #define INT_MIN -32767 #define LONG_MAX +2147483647 #define LONG_MIN -2147483647 #define LLONG_MAX +9223372036854775807 #define LLONG_MIN -9223372036854775807 #define MB_LEN_MAX 1 #define SCHAR_MAX +127 #define SCHAR_MIN -127 #define SHRT_MAX +32767 #define SHRT_MIN -32767 #define UCHAR_MAX 255 #define USHRT_MAX 65535 #define UINT_MAX 65535 #define ULONG_MAX 4294967295 #define ULLONG_MAX 18446744073709551615

所以char short int long long long

CHAR_BIT * sizeof (char) >= 8
CHAR_BIT * sizeof (short) >= 16
CHAR_BIT * (int) 的大小 >= 16
CHAR_BIT * sizeof (long) >= 32
CHAR_BIT * sizeof (long long) >= 64

【讨论】:

【解决方案3】:

是的,C++ 类型大小继承自 C89。

我现在找不到规范。但它在Bible

【讨论】:

  • C++ 标准中的哪个条款暗示来自 C89 的保证也适用于 C++?
  • 我不记得章节和段落,抱歉。但它只是委托给 C89 标准。
  • @Armen: 18.2.2/2: "内容与C标准库头<limits.h>相同。"
【解决方案4】:

请注意,这些类型的保证范围比大多数机器上的范围小一:

signed char -127 ... +127 保证,但大多数二进制补码机器有 -128 ... + 127

对于较大的类型也是如此。

【讨论】:

  • 可能会考虑互补的可能性。
【解决方案5】:

您阅读的内容有几个不准确之处。这些不准确之处要么存在于源代码中,要么您可能记错了。

首先,关于 C 和 C++ 之间的一个特殊区别的迂腐评论。 C 语言不保证整数类型的相对大小(以字节为单位)。 C 语言只保证它们的相对范围。确实int 的范围总是至少与short 的范围一样大,以此类推。但是,C 标准正式允许拥有sizeof(short) > sizeof(int)。在这种情况下,short 中的额外位将用作 填充位,不用于值表示。显然,这只是标准中的法律语言所允许的,并不是任何人在实践中都可能遇到的。

另一方面,在 C++ 中,语言规范对类型的相对 范围 和相对 大小 做出了保证,因此在 C++ 中除了上述范围之外从 C 继承的关系保证sizeof(int) 大于或等于sizeof(short)

其次,C 语言标准保证每种整数类型的最小范围(这些保证在 C 和 C++ 中都存在)。知道给定类型的最小范围后,您总是可以说出这种类型需要多少个形成值的(作为最小位数)。例如,确实需要类型long 具有至少32 个值形成位才能满足其范围要求。如果您想将其重新计算为 bytes,这将取决于您对术语 byte 的理解。如果您专门谈论 8 位字节,那么确实键入 long 将始终包含至少四个 8 位字节。然而,这并不意味着sizeof(long) 总是至少为 4,因为在 C/C++ 术语中,术语 byte 指的是char 对象。 char 对象不限于 8 位。在某些实现中很可能有 32 位 char 类型,这意味着 C/C++ 字节中的 sizeof(long) 可以合法地为 1,例如。

【讨论】:

    【解决方案6】:

    C 标准没有明确规定 long 必须至少为 4 个字节,但它们确实为不同的整数类型指定了最小范围,这意味着最小大小。

    例如,unsigned long 的最小范围是 0 到 4,294,967,295。您需要至少 32 位来表示该范围内的每个数字。所以是的,long 的标准保证(间接)至少是 32 位。

    C++ 继承了 C 的数据类型,所以你必须去看看 C 标准。在这种情况下,C++ 标准实际上引用了 C 标准的部分内容。

    【讨论】:

    • 这可以在 C++ 标准中找到吗?
    • 标准保证 long 至少有 32 位(不是 4 字节:一个字节可以是 32 位长)
    • 我的 C++ 标准副本不包括这个。 (2003)
    【解决方案7】:

    请注意某些机器的字符超过 8 位这一事实。例如,TI C5x 上的 IIRC,long 是 32 位,但 sizeof(long)==2 因为 chars、shorts 和 int 都是 16 位,sizeof(char)==1。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-18
      • 1970-01-01
      • 2016-10-11
      • 2010-09-11
      • 2014-04-10
      • 1970-01-01
      • 2015-08-26
      • 2016-11-01
      相关资源
      最近更新 更多