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 //双精度浮点数
/*********数据类型基本归类************/
整型:short、int、long、char(字符在[内存]中以ASCII码形式存储)、long long。
浮点型:float、double。
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 0001 | 1000 0000 | 1000 0011 |
---|---|---|---|
8位原码: | 1111 1111 | 1000 0000 | 1111 1101 |
加位宽: | 1000 0000 0111 1111 | 1000 0000 1000 0000 | 1000 0000 0111 1101 |
反: | 1111 1111 1000 0000 | 1111 1111 0111 1111 | 1111 1111 1000 0010 |
补: | 1111 1111 1000 0001 | 1111 1111 1000 0000 | 1111 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)使用补符号位扩展能够保证十进制值不变,但不能保证二进制存储的一致性,而处理不同长度的有符号数时,我们必须使用符号扩展。