本文是针对《c程序设计语言》P35页中关于有符号转换为无符号类型数据的小测试,测试环境int类型占用4字节,long类型占用4字节
代码:
#include <stdio.h>
main() {
unsigned int i = 1U;
signed long j = -1L;
printf("i的无符号类型是:%u,\n", i);
printf("i的有符号类型d:%d,\n", i);
printf("j的有符号类型ld:%ld,\n", j);
printf("j的无符号类型u:%lu,\n", j);
printf("i>j?%d\n", i > j);
system("pause");
}
运行结果:
可见signed long转换后变成一个很大的数,我们知道在计算机中存储有符号类型使用补码,本例中的long类型(假设32位)-1的原码为:
1000-0000-0000-0000-0000-0000-0000-0001
补码就是:
1111-1111-1111-1111-1111-1111-1111-1111
当转换为无符号数,评价这个补码大小的规则变了,不再将开头的1位作为判断正负的符号,而是作为真的数字,其结果就是:
2^32-1=4294967295