【问题标题】:What decides the sizeof an integer?什么决定整数的大小?
【发布时间】:2012-03-13 17:32:32
【问题描述】:

sizeof(int) 在我的Dev Cpp 上显示 4,即使它在 64 位机器上运行。为什么它不考虑底层硬件并显示 8 呢?另外,如果我的编译环境也更改为 64 位(64 bit compiler 首先有意义吗?!),那么 int 的大小会改变吗?

有什么标准可以决定这一点吗?

【问题讨论】:

    标签: c compiler-construction 64-bit sizeof


    【解决方案1】:

    取自http://en.wikipedia.org/wiki/64-bit64-bit data models下)

    有各种型号,微软决定sizeof(int) == 4,有些(少数)其他人没有。

    从 Solaris 到 SPARC64 和 Unicos 的 HAL 计算机系统端口似乎是唯一的 sizeof(int) == 8。它们被称为 ILP64 和 SILP64 模型。

    真正的“战争”是针对sizeof(long),微软决定使用sizeof(long) == 4 (LLP64),而几乎其他所有人都选择sizeof(long) == 8 (LP64)。

    请注意,实际上是编译器“决定”使用哪个模型,但正如 wiki 中所写的那样

    请注意,编程模型是基于每个编译器做出的选择,并且多个可以在同一个操作系统上共存。但是,选择作为 OS API 主要模型的编程模型通常占主导地位。

    【讨论】:

    • 而OS API占主导地位的原因是,如果你想调用一个dll或类似的东西(包括系统调用),那么调用者和被调用者需要就参数的大小达成一致。可以进行系统调用的 C 实现通常比不能进行的更有用,因此人们使用操作系统 ABI,除非有理由不这样做。 64 位 Windows 可以运行 32 位可执行文件这一事实要归功于它们(除其他外)提供了程序需要调用的所有内容的 32 位版本。
    • 使int 64 位和char 8 位意味着您不能同时拥有 16 位和 32 位的预定义整数类型(除非您使用 扩展整数类型,但大多数编译器实现者还没有这样做)。
    【解决方案2】:

    虽然编译器最终决定整数的大小,但它通常被继承为 CPU 寄存器的大小,它将保存整数。许多处理器支持 32 位/64 位寄存器算术,编译器设置决定调用哪种模式。 至于sizeof(long)等,唯一的保证就是sizeof(long) >= sizeof(short)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-06
      • 2011-10-26
      • 2017-06-06
      • 2014-04-26
      • 1970-01-01
      • 2016-02-16
      • 2011-04-26
      相关资源
      最近更新 更多