1. 简介
int32_t : 有符号32位整数
最小值 :-2^31 (-2,147,483,648) 最大值 : 2^31 - 1 (2,147,483,647)
uint32_t : 无符号32位整数
最小值 : 0 最大值 :2^32 - 1 (4,294,967,295)
int64_t : 有符号64位整数
最小值 :-2^63 (-9,223,372,036,854,775,808)
最大值 :2^63 - 1 (9,223,372,036,854,775,807)
uint64_t : 无符号64位整数
最小值 :0
最大值 :2^64 - 1 (18,446,744,073,709,551,615)
2.类型转换
char类型变量的范围圆盘图:
如图所示,char类型范围是 -128~127,正数从0递增,大于127后溢出,变为 -128。
int32_t,int64_t都可以这么理解。
1.int32_t 与 uint32_t 互转
(1). int32_t 转 uint32_t
当 int32_t 为负数时,最高位为符号位,转为 uint32_t 后,最高位不再视为符号位,视为数据最高位,因此会得到一个较大的无符号整数,例如:-1
在 uint32_t 中表示为 4,294,967,295.
当 int32_t 为正数时,转为 uint32_t 不变.
(2). uint32_t 转 int32_t
同理,uint32_t 转为 int32_t,当 uint32_t 大于 int32_t 正数最大值时,int32_t 溢出,变为负数。例如:uint32_t 中 4,294,967,295 转为 int32_t 后为 -1.
2.int64_t 与 uint64_t 互转
(1). int64_t 转 uint64_t
当 int64_t 为负数时,最高位为符号位,转为 uint64_t 后,会得到一个较大的无符号整数,例如:-1
在 uint64_t 中表示为 18,446,744,073,709,551,615.
当 int32_t 为正数时,转为 uint32_t 不变.
(2). uint64_t 转 int64_t
同理,uint64_t 转为 int64_t,当 uint64_t 大于 int64_t 正数最大值时,int64_t 溢出,变为负数。
3.int32_t 与 int64_t 互转
int32_t 转 int64_t 会进行符号位扩展(保留正数或负数的符号),数值保持不变,位宽增加至64位
int64_t 转 int32_t ,若 int64_t 为正数,大于 int32_t 最大值,发生溢出,转换为 int32_t 可能为负数,否则进行截断,第32位视为 int32_t 的符号位。若 int64_t 为负数,小于 int32_t 最小值,转换会发生错误.
4.uint32_t 与 int64_t 互转
uint32_t 是无符号32位整数,转换为 int64_t 时,数值会被直接扩展为64位,并保持其正数的值不变。如果 uint32_t 的值超过 INT32_MAX (例如大于 2,147,483,647),它在转换为有符号的 int64_t 仍然是正数,因为 int64_t 的范围更大,可以容纳这个值。
int64_t是64位有符号整数,而 uint32_t 是32位无符号整数。转换时,如果 int64_t 的值为负数,转换成 uint32_t 会导致结果变成一个很大的正数,因为无符号整数不能表示负数。如果 int64_t 的值超出了 uint32_t 的范围(0
到 4,294,967,295
),高位将被截断 uint64_t
5.int32_t 与 uint64_t 互转
int32_t 转 uint64_t :
-
正数转换: 如果 int32_t 的值为正数,转换为 uint64_t 时值保持不变,只是位宽扩展到64位,能安全进行转换。
-
负数转换: 如果 int32_t 的值为负数,转换为 uint64_t 时,由于无符号整数不能表示负数,负数会按照二进制补码解释为非常大的正数。
uint64_t 转 int32_t :
-
值在
int32_t
范围内: 如果 uint64_t 的值在 int32_t 的范围(-2,147,483,648 到 2,147,483,647)内,转换后结果正常。 -
值超过
int32_t
正数范围: 如果 uint64_t 的值大于 2,147,483,647,转换时会发生溢出,结果会变成一个负数。
6.uint32_t 转 uint64_t 互转
uint32_t 转 uint64_t :
uint32_t 是32位无符号整数,而 uint64_t 是64位无符号整数。因为 uint64_t 的位宽更大,所有 uint32_t 的值都可以安全地转换为 uint64_t ,不会有溢出或数据丢失的问题。
uint64_t 转 uint32_t :
-
值在
uint32_t
范围内: 如果 uint64_t 的值小于或等于 4,294,967,295,转换后不会有数据丢失。 -
值超过
uint32_t
范围: 如果 uint64_t 的值超过 4,294,967,295,转换后只保留低32位,高32位会被丢弃,导致结果截断。