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

Any situation where long is preferred over int when sizeof(int)=sizeof(long)

本文关键字:int long sizeof 情况 优于 任何      更新时间:2023-10-16

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

现在在我的台式机上,我观察到sizeof(long)=8而在我的笔记本电脑上sizeof(long)=4

在机器上,如我的笔记本电脑,其中sizeof(int) =sizeof(long)=4有任何情况下,我会更喜欢long超过int,即使它们涵盖相同的整数范围?

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

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

  • bool_Bool的布尔值(如果你有c++或C99,否则使用typedef)
  • enum适用案例区分
  • size_t用于计数和索引
  • unsigned类型当你使用整数作为位模式
  • ptrdiff_t(如果必须)用于地址差异

如果你确实需要一个有符号整数类型的应用程序,使用intmax_t来获得最大的和安全的类型,或者使用intXX_t中的一个来获得具有良好定义的精度和算术的类型。

Edit:如果您主要关注的是性能与一些最小宽度保证使用"least"或"fast"类型,例如int_least32_t。到目前为止,在我编程的所有平台上,精确的宽度类型和"最小"类型之间没有太大的区别,但是谁知道呢。

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

但是,出于可移植性的原因(例如,如果您将代码编译为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_tlong更能表示指针(通常的sizeof(long)==sizeof(void*)假设并不总是正确的)。

time_tsize_t也是为了更容易编写可移植代码而定义的类型,而不必担心平台规范。

只要确保,当您需要分配内存时,您使用sizeof(像sizeof(size_t)一样),而不是假设类型具有任何给定的(硬编码)值。

虽然这肯定不是一个常见的做法,但Linux内核源代码假设指针——任何类型的任何指针——都可以完全放入unsigned long中。

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

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

出于可移植性的原因,如果您需要超过16位和高达32位的精度,您应该使用long。这就是它的全部-如果您知道您的值不会超过16位,那么int就可以了。

相关文章: