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;
区别于 小字节数转换为多字节数,有符号的小字节数需要补符号。