【问题标题】:C++ sizeof integral typesC++ sizeof 整数类型
【发布时间】:2015-06-27 04:42:52
【问题描述】:

我从书籍和演示文稿中听说过 C/C++ 中整数类型的最小尺寸

以下大小以字节为单位:

  • sizeof(char) >= 1
  • sizeof(short) >= 2
  • sizeof(long) >= 4
  • sizeof(long long) >= 8

但我在标准中找不到这些保证。 那么编译器是否需要任何保证来实现标准 C++98/C++2003/C89/C99 中定义的定义?

【问题讨论】:

标签: c++


【解决方案1】:

因为没有。标准仅定义了一些关于价值的基本保证和要求。您可以在第 33 页找到他们in this document

5.2.4.2.1 整数类型的大小。

你可以肯定:

sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long)

sizeof(float) ≤ sizeof(double) ≤ sizeof(long double)

还有:

  • sizeof(char) 保证为 1
  • sizeof(char) == sizeof(signed char) == sizeof(unsigned char)

此外,在大多数平台上:

  • sizeof(char) = 1
  • sizeof(short) = 2
  • sizeof(int) = 4
  • sizeof(long) = 4
  • sizeof(long long) = 8(1)

(1) long long 不是标准类型。 GCC 和 VC++ 已经支持它很长时间了,但官方支持是在 C++ 11 中提供的:

C++: Fundamental Types

long long - 目标类型的宽度至少为 64 位。 (C++11 起)

请注意,即使sizeof(char) 保证为1,也不意味着char 是8 位长。 CHAR_BIT 定义 char 类型的位数。如今,几乎所有架构都使用 8 位/字节,但一些较旧的架构曾经使用 7 位。

【讨论】:

  • 谢谢。顺便说一句,我检查了标准,我在 C++2003 中找不到它,但我在 C99 标准port70.net/~nsz/c/c99/C99RationaleV5.10.pdf,第 38 页中找到了它“因此,C99 采用 long long 作为至少 64 的整数类型的名称位精度”
  • @bruzzo 这个问题被明确地标记为c++,所以答案是特定于C++的——直到C++ 11没有像long long这样的东西。此外,一些编译器可能不支持 C99,即使它们甚至支持最新的 C++ 标准(比如 MSVC——微软只关心那些对他们来说似乎必要的 C 特性——VS 2012 几乎完全不支持 C99,我不知道新版本是否(以及如何)改变)。
  • 你说得对,我只用 c++ 标记了问题,...但我在问题的尾部写了其他 c++ 朋友
  • 我尝试使用 Visual Studio 2012 gui 环境中的 vc 编译器编译 main_c99.c:... int main() { int x[] = {[1]=2};返回大小(x); } -- 它失败了)然后我尝试找到一些类似于 gcc -std=c99 main_c99.c 的标志
  • 我在 Visual Studio 2015 页面的编译器/链接器页面中没有找到任何东西......所以微软似乎对支持 c99 并不感兴趣)
【解决方案2】:

The C++ Programming Language Fourth Edition by Bjarne Stroustrup 对此事的看法如下。

C++ 对象的大小以char 大小的倍数表示,因此根据定义,char 的大小为 1。

• 1 ≡ sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long)
• 1 ≤ sizeof(bool) ≤ sizeof(long)
• sizeof(char) ≤ sizeof(wchar_t) ≤ sizeof(long)
• sizeof(float) ≤ sizeof(double) ≤ sizeof(long double)
• sizeof(N) ≡ sizeof(signed N) ≡ sizeof(unsigned N)

在最后一行中,N 可以是 charshortintlonglong long。另外,保证char至少有8位,short至少有16位,long至少有32位

【讨论】:

  • "另外,保证一个char至少8位,短至少16位,长至少32位"。我在标准中找不到它。
  • see herehere 重新调整 C++ 类型的大小。
  • @bruzzo,提供相同的信息 here
  • @bruzzo,另外here 一个答案解释了C标准中的问题,另一个参考了C++标准。
【解决方案3】:

这不正确,您的值乘以 8。(请注意,sizeof 1 并不一定意味着 8 位,char 中的位数是 CHAR_BIT - 很可能是 8)。

sizeof(char) 保证为1。 (以及unsigned charsigned char)。

除此之外,

sizeof 应用于任何其他基本类型(3.9.1)的结果是 实现定义。 (5.3.3 Sizeof)

sizeof(char) <= sizeof(int) <= sizeof(long long) 有订购限制。

【讨论】:

  • 谢谢。我应该在发布问题之前阅读第 5.3.3 章,并检索到它的减号。
猜你喜欢
  • 2018-04-23
  • 1970-01-01
  • 2013-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
相关资源
最近更新 更多