C语言int32_t, uint32_t, int64_t, uint64_t转换

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 的范围(04,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位会被丢弃,导致结果截断。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值