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;

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

 

 

 

 

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐