C中的“int”是否总是与OS的位数相同?

时间:2014-02-14 17:27:55

标签: c

在系统上,C中的数据类型“int”是否总是与OS的位数相同?

谢谢!

4 个答案:

答案 0 :(得分:6)

不,不一定。仅举一个明显的例子,如果在64位操作系统上使用32位编译器,通常会有32位int

C标准中的要求相当低。超出最小尺寸要求,有(§6.2.5/ 5):

  

'普通''int对象具有执行环境体系结构建议的自然大小(大到足以包含INT_MININT_MAX范围内的任何值在标题<limits.h>)中。

如果您需要确定您的类型至少为64位,则可以使用long long

其他答案中提到了类似int32_t的类型。虽然经常用于其他目的,但这种类型的确适用于需要完全 32位宽的类型的情况,而不管它如何影响性能。

这意味着您通常希望避免这些类型。如果您只需确保至少保持64位整数而不会溢出,则long longint_fast64_t是更好的选择(同样适用于32位类型)。现在,对于64位类型,它不同于64位类型会产生很大的不同。

对于32位类型(例如),它可能会有所不同。 int32_t必须正好是32位宽,但在64位处理器上运行64位操作系统的64位进程中,64位类型很可能更快比32位类型。我将使用int32_t的一些遗留(但不是非常古老)的代码的速度提高了大约三倍。当时(在32位编译器和操作系统上)它没有引起问题,但在64位系统上,它实施了相当多的额外工作,因为他们真正想要的是int_fast32_t - - 支持至少32位的最快类型。

同样,在未来的某个时刻,我们将开始使用“大于”64位的处理器,这几乎是不可避免的。当我们这样做时,我们可能会遇到与我们现在使用32位类型的64位类型相同的情况:人们在他们可能需要时会使用int64_t的很多地方{ {1}},并且它们的代码运行速度会比它真正需要的速度慢得多,因为它们需要它们(例如)128位处理器将操作数掩盖到64位,而不是使用原生大小的处理器。

答案 1 :(得分:2)

没有。它取决于操作系统和体系结构(即:运行操作系统的处理器类型)。常见的原始类型(如intunsigned等)将依赖于系统,因此根据您使用的系统,int可能是16,32或任意大小。

如果要保证值的大小,则需要使用固定宽度类型。如果您想这样做,请查看<stdint.h>以及它为您提供的新原语,例如int32_tuint8_t等。

<强>参考


  1. 整数类型,于2014-02-14访问,<http://www.cplusplus.com/reference/cstdint/>

答案 2 :(得分:1)

标准不要求这样做。实际上它通常可以,但是this thread提到它在嵌入式系统中更常见错误。

答案 3 :(得分:0)

在64位Debian上,这个小程序

#include <stdio.h>

int main() {
    #define printSize(aType) printf("sizeof " #aType " = %ld\n", sizeof(aType))
    printSize(void*);
    printSize(char);
    printSize(short);
    printSize(int);
    printSize(long);
    printSize(long long);
}

打印以下内容:

sizeof void* = 8
sizeof char = 1
sizeof short = 2
sizeof int = 4
sizeof long = 8
sizeof long long = 8

因此,不仅{64}系统上int不需要是64位,还有真实的通用系统,int的大小与指针大小相悖。因此,您不应该依赖这些类型的大小。


此规则有例外情况,您可以依赖基本类型的大小。这些在C标准中明确提到。最重要的两个是:

  1. char必须是一个8位(但你不能指望它是有符号或无符号的。)

  2. long long必须至少为64位。

  3. 当然,long必须至少与int等一样大。