数据类型int、long、longlong、固定长度类型的选择

在 C/C++ 中,intlong 、long long是三种常用的整数类型它们的大小和范围可能因平台和编译器而异。


int

              大小:通常为 4 字节(32 位)。
              范围:-2^31~2^31-1(10^9数量级)
              用途

                           1.适合大多数通用场景,例如计数器、数组索引、简单的数学运算等。

                           2.是 C/C++ 中最常用的整数类型,性能通常较好。

              选择建议:如果数值范围在 ±21 亿以内,优先使用 int

long

              大小:在 32 位系统上,通常为 4 字节(32 位),范围: int 相同。
                         在 64 位系统上,通常为 8 字节(64 位),范围: -2^63~2^63-1(10^18数量级)
              用途:

                       1.适合需要更大范围的整数,但仍然需要考虑平台兼容性。

                       2.在 32 位系统上,long 和 int 可能没有区别。

              选择建议:

                       如果需要更大的范围(例如超过 ±21 亿),并且代码主要在 64 位系统上运行,可以使用 long。

                       如果需要跨平台兼容性,建议使用固定长度的类型(如 int64_t)。


long long

             大小:固定为 8 字节(64 位)。
             范围:-2^63~2^63-1(10^18数量级)
             用途

                      1.适合需要非常大范围的整数,例如时间戳、大数计算等。

                      2.是 C99 标准引入的,具有固定的 64 位长度,跨平台兼容性更好。

             选择建议:

                      如果数值范围超过 int 或 long 的范围,优先使用 long long。

                      如果需要明确的 64 位整数,优先使用 long long 而不是 long。


固定长度类型

              为了确保代码的可移植性和一致性,C/C++ 提供了固定长度的整数类型

                                          (定义在 <stdint.h> 或 <cstdint> 中)  

                     int32_t:固定 32 位整数,范围与 int 相同。

                     int64_t:固定 64 位整数,范围与 long long 相同。

                     uint32_t 和 uint64_t:无符号版本。

               选择建议:如果需要明确的位数和跨平台兼容性,优先使用固定长度类型(如 int32_t 或 int64_t)。

总结

数据类型大小(字节)范围使用场景
int-2^31~2^31-1(10^9数量级)通用场景,性能优先
long4或8

32位机:同int

64位机:同long long

需要更大范围,但平台兼容性不确定
long long8-2^63~2^63-1(10^18数量级)需要非常大范围,跨平台兼容性好
int32_t同int 需要明确32位整数,跨平台兼容
int64_t8同long long需要明确64位整数,跨平台兼容

### C/C++ 中 `long long` 和 `int` 类型相加的结果类型及注意事项 当 `long long` 和 `int` 类型的数据进行相加操作时,结果的类型取决于编译器的具体实现和平台架构。然而,通常情况下,为了确保足够的表示范围并遵循C/C++标准中的算术转换规则,最终结果会被提升为更宽泛的类型。 #### 结果类型推导 依据C/C++的标准规定,在执行二元运算之前会先应用“常用算术转换”,这意呸着较小宽度的操作数将会被自动升级至与另一方相同或更大的整数类型以便于计算[^1]。对于`long long`加上`int`的情形: - 如果目标平台上`long long`至少有64位而`int`通常是32位,则后者将被隐式转换成前者; - 这样做能够防止因数值溢出而导致意外行为的发生,并且保证整个表达式的求值过程都在较高精度下完成。 因此,在大多数现代系统上,`long long + int` 的实际效果相当于两个`long long`之间的加法,即返回一个同样属于`signed long long`类型的值[^4]。 #### 注意事项 为了避免潜在的风险,建议开发者注意以下几点: - **显式类型转换**:尽管存在默认的类型提升机制,但在某些特殊场景下仍可能引发意想不到的问题。通过使用强制类型转换[(类型名)](expression),可以明确指定期望得到的目标类型,从而增强代码可读性和维护性[^2]。 ```cpp long long result = static_cast<long long>(someIntValue) + anotherLongLongValue; ``` - **检查边界条件**:务必确认参与运算的各项不会超出各自允许的最大/最小界限,尤其是当涉及到不同长度的带符号和无符号整数混合运算的时候[^3]。 - **跨平台兼容性考量**:由于各硬件体系结构间可能存在差异(比如字节序、指针大小),所以在编写涉及多种基础数据类型的算法前应充分调研目标环境特性,必要时采用固定宽度整数类型如`std::int_least64_t`来替代传统的内置类型声明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值