有符号位的强转问题

32位数据 --> 64位数据  位宽变大  超过之后前面补F

U32 = 0X12345678 一个16进制为4个2进制 32位表示为0X12345678

无符号位无影响;主要是有符号位的符号在影响;

有符号的 32位0x8000000 符号位为1表示负数,为1表示正数;
在这里插入图片描述
在这里插入图片描述

现象:32位有符号强转为64位无符号位后,前面会打印多余的F。

相关概念:

1.在计算机系统中,整型数据在内存中一律用补码的形势来存储,使用补码可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器)。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

2.数据类型及归类

/*****基本数据类型*****/

char         //字符数据类型
short        //短整型
int          //整型
long         //长整型
long long    //长长整型
float        //单精度浮点数
double       //双精度浮点数
    
/*********数据类型基本归类************/
整型:shortintlongchar(字符在[内存]中以ASCII码形式存储)、long long。
浮点型:floatdouble

3.打印出来的值,是内存中真实存储的值,即为补码方式。

4.补码的最高位能起到显示正负的功能,但是是数值位。

5.负数的求反码和补码过程符号位是不参与计算的,要取出来,只有在进行负数补码的加减法的时候符号位才参与计算 。

8位补码: 	1000 0000								
8位原码:	1000 0000						   		

加位宽:	1000 0000 1000  0000				

16位反码:		 1111 1111 0111 1111
16位补码:		 1111 1111 1000 0000	
16进制显示:		FF80
8位补码:1000 00011000 00001000 0011
8位原码:1111 11111000 00001111 1101
加位宽:1000 0000 0111 11111000 0000 1000 00001000 0000 0111 1101
反:1111 1111 1000 00001111 1111 0111 11111111 1111 1000 0010
补:1111 1111 1000 00011111 1111 1000 00001111 1111 1000 0011
举个例子:

-127原码1111 1111,反码1000 0000,补码1000 0001。计算机存储的是1000 0001,用十六进制表示为0x81。

当使用补零扩展时,结果为:
0000 0000 0000 0000 0000 0000 1000 0001 (与补码数值形式一致)
用十六进制表示为0x81。为了计算十进制值,计算它的补码,结果为:
0000 0000 0000 0000 0000 0000 1000 0001
将这个二进制数转成十进制的结果是129。

当使用补符号位扩展时,结果为:
1111 1111 1111 1111 1111 1111 1000 0001 (和补码数值看上去差别较大)
用十六进制表示为0xFFFFFF81。为了计算十进制值,计算它的补码,结果为:
1000 0000 0000 0000 0000 0000 0111 1111
将这个二进制数转成十进制的结果是-127。

由此可以得出结论:
(1)使用补零扩展能够保证二进制存储的一致性(和我们数学常理一致),但不能保证十进制值不变。所以,处理无符号二进制数的时候,可以使用零扩展将小位数的无符号数扩展到大位数的无符号数。
(2)使用补符号位扩展能够保证十进制值不变,但不能保证二进制存储的一致性,而处理不同长度的有符号数时,我们必须使用符号扩展。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值