当sizeof(int)= sizeof(long)时,long优先于int的任何情况

时间:2011-12-04 07:23:36

标签: c++ c

我的台式机和笔记本电脑分别运行64位和32位Ubuntu 10.10。我使用gcc编译器

现在,在我的桌面计算机上,我在笔记本电脑sizeof(long)=8上观察到sizeof(long)=4

在我的笔记本电脑等机器sizeof(int) =sizeof(long)=4有哪些情况下我会更喜欢long而不是int,即使它们覆盖相同的整数范围?

在我的桌面上当然long如果我想要更大范围的整数(当然我可以使用int64_tlong long也是有利的)

5 个答案:

答案 0 :(得分:5)

不要使用它们中的任何一个。在现代C(从C89开始)或C ++中,有typedef具有帮助您编写可移植代码的语义。 int几乎总是错误的,我仍然拥有的唯一用例是库函数的返回值。否则使用

    布林人的
  • bool_Bool(如果你有C ++或C99,否则使用typedef
  • enum申请案例区别
  • size_t用于计算和编制索引
  • 使用整数作为位模式时的无符号类型
  • ptrdiff_t(如果必须)地址差异

如果您确实有一个应用程序用于有符号整数类型,请使用intmax_t以获得最多且位于安全端,或使用intXX_t之一以使其具有良好类型定义精度和算术。

编辑:如果主要关注的是具有最小宽度保证的性能,请使用“最少”或“快速”类型,例如int_least32_t。在我编程到目前为止的所有平台上,精确宽度类型和“最少”类型之间没有太大区别,但是谁知道。

答案 1 :(得分:4)

在32位操作系统上,sizeof(int)==sizeof(long)==4 intlong提供相同的服务。

但是,出于可移植性的原因(例如,如果以64位编译代码),因为int将保持32位而long可以是32位或64位,你应该使用适合常量大小的类型来避免溢出。

为此,<stdint.h>标头声明了非模糊类型,如:

int8_t
int16_t
int32_t
uint8_t
uint16_t
uint32_t

intptr_t

intptr_t / uintptr_t可以表示指针优于long(常见sizeof(long)==sizeof(void*)假设并非总是如此)。

time_tsize_t也是定义的类型,可以更轻松地编写可移植代码,而不用担心平台规范。

只需确保在需要分配内存时,使用sizeof(如sizeof(size_t)),而不是假设某个类型具有任何给定(硬编码)值。

答案 2 :(得分:1)

虽然它确实不是常见的实践,但Linux内核源假设指针 - 任何类型的指针 - 都可以完全适合unsigned long。< / p>

答案 3 :(得分:1)

正如上面提到的@Alf,出于可移植性的原因,您可以选择int或long。

  • 在较旧的16位操作系统上,int为16位,long为32位;
  • 在32位Unix,DOS和Windows(或运行32位程序的64位处理器)上,int和long是32位;
  • 在64位Unix上,int是32位,而long是64位。

答案 4 :(得分:0)

出于可移植性的原因,如果需要16位以上且精度高达32位,则应使用long。这真的就是它 - 如果你知道你的价值不会超过16位,那么int就可以了。