1、无符号和有符号数之间的相互转换
规则:对应的二进制代码不变,只是改变数的类型
#include<stdio.h> int main() { int a = 0xffffffff; unsigned b = a; printf("%d,%u\n",a,b); printf("%x,%x\n",a,b); return 0; }
运行结果: -1,4294967295 ffffffff,ffffffff
由上例可知两个数的机器代码完全相同。
2、小字长与大字长的相互转换
规则:长字长赋给短字长时采用截取低位的方式,短字长赋给长字长时采用符号位拓展的方式
#include<stdio.h> int main() { int a = -1, b = 1; short x = a, y = b; unsigned short u = a, v = b; printf("%d,%d\n",a,x); printf("%x,%hx\n",a,x); printf("%d,%d\n",b,y); printf("%x,%x\n",b,y); printf("%d,%u\n",a,u); printf("%x,%x\n",a,u); printf("%d,%u\n",b,v); printf("%x,%x\n",b,v); return 0; }
运行结果: -1,-1 ffffffff,ffff 1,1 1,1 -1,65535 ffffffff,ffff 1,1 1,1
#include<stdio.h> int main() { short a= -1, b = 1; int x = a, y = b; printf("%d,%d\n",x,a); printf("%x,%hx\n",x,a); printf("%d,%d\n",y,b); printf("%x,%x\n",y,b); unsigned short u = 0xffff; //以下这段程序的输出比较有趣可以自己研究 short v = -1; printf("%x,%x",u,v); return 0; }
运行结果: -1,-1 ffffffff,ffff 1,1 1,1 ffff,ffffffff //按理说short类型是16位怎么输出32位^..^??好像是跟参数传递时的压栈对齐有关!