知识点1【原码 反码 补码】
注意:
无符号数,正数:他们的 原码==反码==补码
负数:反码=原码的符号位不变 其他位取反
补码=反+1.
(重要):负数在计算机中存储的是补码。
计算机 为啥 要补码?
以1字节分析:
如果没有补码:
6-10== -4
6+(-10) == -4
0000 0110
1000 1010
--------------
1001 0000 == -16(错误)
如果有补码:
0000 0110
1111 0110
----------------------
1111 1100----->1000 0011--->1000 0100==>-4
总结:补码的意义-将减法运算 变加法运算
以1字节分析:
有符号符:1111 1111~1000 0000~0000 0000~0111 1111
-127 ~ -0 ~ +0 ~ +127
计算机为了扩数据的表示范围:故意将-0看成-128
-128~127
无符号数:0000 0000 ~ 1111 1111 == 0~255
总结:补码统一 0 的编码。
+0 == 0000 0000==0000 0000(反码)==0000 0000(补码)
-0 == 1000 0000 ==1111 1111(反码)==0000 0000(补码)
总结:补码意义:将减法运算 变加法运算 同时统一了0的编码。
知识点2【计算机对数据的存储 与 读取】
存储:
#include<stdio.h>
void test01()//存储
{
//负数 以补码 存储
char data = -10;
//正数 以原码 存储
char data2 = 10;
//十六进制 以 原码存储
char data3 = 0xae;//0xae==1010 1110
//八进制 以 原码存储
char data4 = 0256;//0256==1010 1110
//每3位二进制 代表 一位八进制
//如果数据越界 以原码 存储
char data5 = 129;//1000 0001
unsigned char data6 = -10;//0000 1010
//取 %x %u %o 都是输出内存的原样数据
//每4位二进制 代表 一位十六进制(记住)
printf("%x\n", data);//0xf6==1111 0110
printf("%x\n",data2);//0x0a ==0000 1010
printf("%x\n",data3);//0xae
printf("%x\n",data4);//0xae
printf("%x\n",data5);//0x81
printf("%x\n",data6);//0xfb
}
int main(int argc,char *argv[])
{
test01();
return 0;
}
取:
void test02()
{
char data1 = -10;
char data2 = 10;
//取:%d %hd %ld有符号取 %u %x %o %lu都是无符号取
//有符号取:%d %hd %ld
//首先看内存的最高位如果为1 将内存数据符号位不变取反+1到原码
//最高位如果为0 将数据原样输出。
//无符号取:将内存数据原样输出
printf("%d\n",data1);//-10
//data1&0x000000ff 只取低8位
printf("%u\n",data1&0x000000ff);//246==1111 0110
printf("%d\n",data2);//10
}