码迷,mamicode.com
首页 > 其他好文 > 详细

P54 扩展数字的位表示

时间:2020-01-05 13:57:18      阅读:87      评论:0      收藏:0      [点我收藏+]

标签:strong   大小   point   int   pointer   inter   负数   signed   sizeof   

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

 

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

 

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

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

P54 扩展数字的位表示

标签:strong   大小   point   int   pointer   inter   负数   signed   sizeof   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!