我的台式机和笔记本电脑分别运行64位和32位Ubuntu 10.10。我使用gcc
编译器
现在,在我的桌面计算机上,我在笔记本电脑sizeof(long)=8
上观察到sizeof(long)=4
。
在我的笔记本电脑等机器sizeof(int) =sizeof(long)=4
有哪些情况下我会更喜欢long
而不是int
,即使它们覆盖相同的整数范围?
在我的桌面上当然long
如果我想要更大范围的整数(当然我可以使用int64_t
或long long
也是有利的)
答案 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
int
和long
提供相同的服务。
但是,出于可移植性的原因(例如,如果以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_t
和size_t
也是定义的类型,可以更轻松地编写可移植代码,而不用担心平台规范。
只需确保在需要分配内存时,使用sizeof
(如sizeof(size_t)
),而不是假设某个类型具有任何给定(硬编码)值。
答案 2 :(得分:1)
虽然它确实不是常见的实践,但Linux内核源假设指针 - 任何类型的指针 - 都可以完全适合unsigned long
。< / p>
答案 3 :(得分:1)
正如上面提到的@Alf,出于可移植性的原因,您可以选择int或long。
答案 4 :(得分:0)
出于可移植性的原因,如果需要16位以上且精度高达32位,则应使用long
。这真的就是它 - 如果你知道你的价值不会超过16位,那么int
就可以了。