当sizeof(int)=sizeof(long)时,long优于int的任何情况
Any situation where long is preferred over int when sizeof(int)=sizeof(long)
我的台式机和笔记本电脑分别安装了64位和32位的Ubuntu 10.10。我使用gcc
编译器
现在在我的台式机上,我观察到sizeof(long)=8
而在我的笔记本电脑上sizeof(long)=4
。
在机器上,如我的笔记本电脑,其中sizeof(int) =sizeof(long)=4
有任何情况下,我会更喜欢long
超过int
,即使它们涵盖相同的整数范围?
在我的桌面上,如果我想要更大范围的整数,当然long
是有利的(当然我也可以使用int64_t
或long 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)==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)
一样),而不是假设类型具有任何给定的(硬编码)值。
虽然这肯定不是一个常见的做法,但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
就可以了。
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- <Windows>为什么 std::thread::native_handle 返回类型为"long long unsigned int"的值,而不是 void*(又名 HANDLE)?
- 错误:隐式转换更改符号:'int'到'unsigned long'
- 对 '(const Y) (int&, std::mersenne_twister_engine<long unsigned int,
- 自动类型默认为 int 而不是 long
- 错误:'class std::unique_ptr<std::set<long unsigned int> >'没有名为 'size' 的成员
- "1L << count"是什么意思?如何使用超出"unsigned long long int? "范围的语句编号打印?
- Visual studio 2013 和 g++ 7.1 中将 int 和 long 类型相乘时的 c++ 差异行为
- 错误:调用'begin(long double [nPoints])'没有匹配函数;使用硬编码的 int 与整数变量初始化向量
- 只读位置'__result.std::_Rb_tree_const_iterator<_Tp>::operator*<long long int>()'分配错误
- C++ vector::size_type:有符号与无符号;int vs. long
- 错误:将"long int (*)[4]"分配给"long int [4][4]"时的类型不兼容
- 没有匹配函数来调用"std::basic_ofstream<char>::write(std::string*, long long unsigned int)"
- 函数参数可以是char*、long或int.可能吗
- unsigned int/signed int/long-long:无法解释的输出
- 如何在C++中将二进制文件上下文转换为 int/long 值
- <int> <long> 当它们的大小相同时,将矢量转换为矢量?
- " long unsigned typedef int long ullong; "是什么意思?
- 我如何使用3个重载函数(参数的差异是int, long, float)同时只要求一个输入项
- 使用非固定整数(int, long)而不是固定大小的整数(int64_t, int32_t)有什么优势吗?