P54 扩展数字的位表示

背景:不同字长的整数进行转换,需要在不改变数的大小的前提下将较小的数据类型转为更大的数据类型。

无符号数的扩展:开头加0即可,也叫零扩展。

有符号数(补码)的扩展:开头添符号位。

 1     short sx = -12345;
 2     unsigned short usx = sx;
 3     int x = sx;
 4     unsigned ux = usx;
 5 
 6     printf("sx = %d:	", sx);
 7     show_bytes((byte_pointer)&sx, sizeof(short));
 8     printf("usx = %u:	", usx);
 9     show_bytes((byte_pointer)&usx, sizeof(unsigned short));
10     printf("x = %d :	 ", x);
11     show_bytes((byte_pointer)&x, sizeof(int));
12     printf("ux = %u:	", ux);
13     show_bytes((byte_pointer)&ux, sizeof(unsigned));

注:show_bytes的作用是转换十六进制

运行结果

sx=-12345:  cf c7

usx=53191     cf c7

x=-12345        ff ff cf c7

ux=53191       00 00 cf c7

12345(short)->11 0000 0011 1001(原码)->0011 0000 0011 1001(short,2byte=2*8bit=16位)->1011 0000 0011 1001(最高位添1,-12345的原码)

->1100 1111 1100 0111(-12345的补码)->cf c7(十六进制)

12345(int)->11 0000 0011 1001(原码)->0000 0000 0000 0000 0011 0000 0011 1001(int,4byte=4*8bit=32位)->1000 0000 0000 0000 0011 0000 0011 1001(原码)

->1111 1111 1111 1111 1100 1111 1100 0111(补码)->ff ff cf c7(十六进制)

对比无符号的扩充,cf c7->00 00 cf c7,即零扩展,不难看出,16位扩展至32位的过程中,

补码由1100 1111 1100 0111变成了1111 1111 1111 1111 1100 1111 1100 0111,其变化在于前面补了若干个1,1即-12345的符号位。如果是正数(符号位为0),添0。

因此,实际上扩展数字的位表示可以统一起来

无符号数/正数  0扩展

负数       1扩展

先扩展位,再完成有符号到无符号的转化

如,short->unsigned int

原文地址:https://www.cnblogs.com/CofJus/p/12151954.html