大家可能都犯过类似的错误,char与unsigned char没有区分使用(不仅是初学者最容易犯的错误),特别是字符以16进制"%02x"输出时,输出结果比较奇怪,本该输出0xff(1byte),而输出的却是0xffffffff(4byte),其原因是本该使用unsigned char我们却使用了char。你可能知道是我们用错了数据类型,换过来了觉得很简单,而没有去理解其中的原因。下面这个例子可帮助你找到原因。
理解2个概念就知道为什么会这样:
1)数据是以补码形式存储于内存中;
2)格式化输出的类型:%d为十进制整型输出,%u为无符号十进制整型输出。
c=4294967295的原因是,-1以%u无符号整形(4个字节)的补码形式(4字节32个二进制1)输出,其十进制正是4294967295。
a=255的原因是,-1在赋予a(1个字节)时,是以补码形式(1字节8个二进制1)存储于a的内存,其十进制正是255。255以%u无符号整形(4个字节)的补码形式输出自然就是255。