【问题标题】:sizeof unsigned int in microsoft x64-compiler [duplicate]microsoft x64编译器中的sizeof unsigned int [重复]
【发布时间】:2012-10-31 09:31:42
【问题描述】:

可能重复:
What is the bit size of long on 64-bit Windows?

为什么当我在 Microsoft Visual Studio 2010 中编译为 x64 时,sizeof(unsigned int) == 4不是必须不应该是8 == sizeof(int)吗?我在配置管理器和 command_line_compiler 中更改平台,所有设置都是 x64,但大小为 unsigned int = 4

我做错了什么?

【问题讨论】:

  • 请注意,即使在 Unix 64 位系统上,sizeof(int) == sizeof(unsigned int) 和两者都是 4(不是 8)。在 Unix 上,long(和unsigned long)是 64 位数量; long longunsigned long long 也是如此。这是 LP64(long 和指针是 64 位)模型。 Windows 64 将 intlong 都保留为 32 位,并且只有 long long 和指针是 64 位数量(LLP64 — long long 和指针是 64 位)。

标签: c 64-bit int


【解决方案1】:

不是必须 = 8 = sizeof(int)

不,不必这样。各种整数类型的大小取决于实现,标准仅规定(在第 5.2.4.2 节中)一些最小范围。

例如,char 必须至少有 8 位,short intint(也是其 unsigned 版本,其大小和对齐要求必须与相应的有符号类型相同)必须至少有 16 位,long 必须至少有 32 位,long long 必须至少有 64 位。

即使在 64 位系统上,int(和 unsigned int)通常也是 32 位类型。

long 是 32 位还是 64 位取决于,在大多数(如果不是全部)64 位 Linux 系统上是 64 位,在 Windows 64 位上是 32 位。

【讨论】:

  • 在 Windows 64 上始终为 32 位。
  • 另外,你应该提到同名的无符号和有符号整数类型(int 和 unsigned int、long 和 unsigned long 等)应该具有相同的大小。
【解决方案2】:

不是必须 = 8 = sizeof(int) 吗?

如果这是,用正确的英语,应该意味着“它的大小不应该等于 int 的大小”?那么答案是:是的,标准要求无符号整数类型及其对应的有符号类型的大小相同。如果不是这种情况,那么 Visual Studio 的编译器不符合标准(惊喜,惊喜...)。

但是,intunsigned int 可能都是 4 字节长 - 这没有什么特别奇怪的,即使在 64 位实现上也是如此。 longlong long(以及它们的无符号对应项)可能是 8 字节长。

【讨论】:

    【解决方案3】:

    语言标准没有说明sizeof(int) 或任何数据类型。它的实现已定义。

    但它应该遵循这个规则:

    1<=sizeof(char) < sizeof(short) <= sizeof(int) <= sizeof(long) < sizeof(long long)
    

    【讨论】:

    • “1 标准告诉我们的远不止这些(C99 6.5.3.4:3)。 “sizeof(char) 标准没有这么说。 “sizeof(long) 标准没有这么说。
    猜你喜欢
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-07
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多