c语言中int/uint数据转换(不需要补符号位的情况)

 

    uint uvalue = 2147483648;
    printf("%x,%d,%u\n",uvalue,uvalue,uvalue);


    uvalue = -2147483648;
    printf("%x,%d,%u\n",uvalue,uvalue,uvalue);

    uvalue = -2147483649;
    printf("%x,%d,%u\n",uvalue,uvalue,uvalue);

    int ivalue = 2147483648;
    printf("%x,%d,%u\n",ivalue,ivalue,ivalue);

系统默认的数据类型是int ;

对于未超过int的最小值(-2147483648) 且未超过uint的最大值(4294967296)的数值,都可以按原先的数值显示,不会丢失位数。

例如上例中:

uint uvalue = -2147483648;  使用 %d可以原样输出;//可以这么理解:赋值给int,没有超出int的取值范围,且不需要补符号位,则原样赋值。

int ivalue = 2147483648; 使用%u可以原样输出。//可以这么理解:赋值给uint,没有超出uint的取值范围,且不需要补符号位,则原样赋值。//类比char,只不过char需要补符号位

原因分析:

无论是uint还是int ,从十六进制的表示形式来看都是

uint:   00 00 00 00  至  ff ff ff ff

int : 80 00 00 00    至  7f ff ff ff

遵循十六进制的加减法规则(7f ff ff ff +1 = 80 00 00 00),只是对于int类型,有一半的数对应表示负数(80 00 00 00 表示-2147483648,而不是2147483648)。

参考该文,无论是单字节还是多个字节,在不需要补位的情况下,只要不超过正的最大值和负的最小值时,码值都是同一个码值。

 

总结:在不需要补符号的数据转换中,数据只要不超过数据类型所占位数的解释能力,该数据就能被还原,而无论当前的数据类型是有符号的,还是无符号的(即:跟当前数据类型有无符号无关)。

例如:

uint   value = -2147483648;

-2147483648  ,我们使用 int 类型就能还原--- int  ivalue = value;

int  ivalue = 2147483649;

2147483649,我们使用uint类型就能还原------uint  uvalue = ivalue;

区别于 小字节数转换为多字节数,有符号的小字节数需要补符号。

 

 

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值