short sx = -12345; /*-12345*/
unsigned short usx = sx; /*53191*/
int x = sx; /*-12345*/
unsigned ux = usx; /*53191*/
printf("sx = %d:\t",sx);
show_bytes((byte_pointer) &sx, sizeof(short));
/*此函数博客地址https://mp.csdn.net/postedit/90543468*/
printf("usx = %u:\t",usx);
show_bytes((byte_pointer) &usx, sizeof(unsigned short));
printf("x = %d:\t",x);
show_bytes((byte_pointer) &x, sizeof(int));
printf("ux = %u:\t",ux);
show_bytes((byte_pointer) &ux, sizeof(unsigned));
在采用补码表示的32位大端机器上运行这段代码时,打印出如下输出:
sx = -12345: cf c7
usx = 53191: cf c7
x = -12345: ff ff cf c7
ux = 53191: 00 00 cf c7
-12345的补码表示和53191的无符号表示在十六字长时是一样的,但由于符号扩展-12345是扩展符号位1而53191是扩展符号位0,所以三十二位表示是不同的。
ps:此文章是学习《深入理解计算机系统》的课堂笔记,上述代码出自《深入理解计算机系统》一书。