2.8 原码、反码、补码
2.8.1 原码、反码、补码的概述
计算机存储的是数据的补码。
原码:计算机中对数据的二进制定点表示方法
123:原码0111 1011
无符号数:
补码==反码==原码
123原码:0111 1011
123反码:0111 1011
123补码:0111 1011
有符号数:
正数:
补码==反码==原码
+123原码:0111 1011
+123反码:0111 1011
+123补码:0111 1011
负数:
反码==原码符号位不变,其他位按位取反。
补码==反码+1
-123原码:1111 1011
-123反码:1000 0100
-123补码:1000 0101
负数在计算机以补码的方式存储
非负数在计算机以原码的方式存储
2.8.2 补码的意义
1、统一了0的编码
+0的补码:0000 0000
-0的补码:0000 0000
2、将减法运算变加法运算
假如:没有补码10-6
10: 0000 1010
-6: 1000 0110
------------------------
1001 0000----->-16结果有问题
有补码 10-6
10: 0000 1010
-6: 1111 1010
-------------------------
0000 0100---->4
2.8.3 对数据的存
负数在计算机以补码的方式存储
非负数在计算机以原码的方式存储
八进制数 以原码存储
十六进制 以原码存储
以十六进制查看内存数据存储情况
short data1 = -10;//补码存储
cout<<bitset<16>(data1)<<endl;//1111 1111 1111 0110
short data2 = 6;//原码存储
cout<<bitset<16>(data2)<<endl;//0000 0000 0000 0110
short data3 = 0x8080;//原码存储
cout<<bitset<16>(data3)<<endl;//1000 0000 1000 0000
2.8.4 对数据的取
如果是对 无符号变量 进行取值,输出内存的原样数据。
//先将-10转成无符合数(-10的补码)
unsigned short data = -10;//源码1000 0000 0000 1010 补码1111 1111 1111 0110
cout<<bitset<16>(data)<<endl;//1111 1111 1111 0110
cout<<"data="<<data<<endl;//65526==1111 1111 1111 0110
如果是对 有符号变量 进行取值,系统会去看内存的最高位,如果最高位为0 表明正数,内存原样输出。
short data = 10;//原码0000 0000 0000 1010
cout<<bitset<16>(data)<<endl;//0000 0000 0000 1010
cout<<"data="<<data<<endl;//10
系统会去看内存的最高位,如果最高位为1表明负数,将内存数据求补码(得到原码)输出
short data=0x8080;//1000 0000 1000 0000
cout<<bitset<16>(data)<<endl;//1000 0000 1000 0000
cout<<"data="<<data<<endl;//-32640 = 1111 1111 1000 0000