1、首先要知道,换算规则:原码转换为反码:符号位不变,数值位分别“按位取反” 。
2、接着反码转换为原码也是一样,但规则却慎芦有不同之处:符号位不变,数值位分别“按位取反”。
3、然后就是,原码转换为补码的规则:符岁孝喊号位不变,数值位按位取反,末位再加1。
4、最后补码转换为原码:符号位不变,数值位按位取反,末位再加1,即补码的补码等于原码。
5、而求补(变补)的换算规则与之前乎野有所差别:符号位和数值位都取反,末位再加1。
反码补码原码怎么转换,来看看方法吧。
1、首先原始代码的最高位是符号位,0表示正,1表示弊轮负,中间值表示数字的绝对值。
2、符号的反转,正数符号的反转与原符号相同,负数的补数是该符号的最低有效位数加上1。
3、补数,正数的补数与原代码相同,负数的补数在其倒数第一的基础上加1。零分为+0和-0。 进行激卜敬不同符号的加法或同一符号的减法时,不能直接进行加法或减法,不能直接给出正负的结果。
4、必须先取绝对值,然后再加上减法。 符号比特由较大的绝对值决定,因此出现了转码。 反码是对原始代码的改进。补码在针对加减运算和明慎正负零的问题上都解决了,平时用的最多的也就是补码。
1首先了解 低字节位 和高字节位 看图
2字节在内存的排列方式
//int num = 010//0开头代表 8禁止 //("%d",num)//所以打印的是8 int num = 0x12345678//将占 2 32位 printf("%p", &num)/* 要特别 注意 低位 在低字节 高位 高字节 0x0063FAC0 78 x 0x0063FAC1 56 V 0x0063FAC2 34 4 0x0063FAC3 12 . */ 看图2
3 printf 不会进行自动转换 void main(){ printf("%d", 10.3) printf("\n%f", 10)
getchar()}
请看图3
4 一定要注意数据会溢出数据会溢出请看图4
unsigned short num = 65535 printf("我有现金:%d元",num)
unsigned short num = 65535+1 printf("我有现金:%d元",num)
上面这样数据就会溢出
5 原理
头文件#include<limits.h>printf("%d", INT_MAX)printf("\n%d", INT_MIN)printf("\n%u", UINT_MAX)//有负号的情况下 0代表正式 1代表负数 //1111 1111 1111 1111 1111 1111 1111 1111 //0111 1111 1111 1111 1111 1111 1111 1111
6源码反码补码
//1的源码和-1的源码 //0000 0000 0000 0000 0000 0000 0000 0001 //1000 0000 0000 0000 0000 0000 0000 0001//-1符号为是1
源码反码补码过程//源码1000 0000 0000 0000 0000 0000 0000 0001
//-1反码1 符号位不变 所有0变1 1变0//111 1111 1111 1111 1111 1111 1111 1110
//-1补码 符号位不变 所有0变1 1变0 在补1(在虚扒反码基础是+1)//111 1111 1111 1111 1111 1111 1111 1111 unsigned int num = -1 printf("%d %u", num, num)
虽然补码后二进制相同 但是他们有负号的符号位不算 所以差首昌数据不相同
7为什么要用补码 非常重要!!!
0000 0001 1 (1代表十进制)1000 0010 2 (1000 0010 是2的源码)
如果我们用2的补码1000 0010 源码
1111 1101 反码(所有位取反 负号不变)
1111 1110 补码(反码基础 +1)
这时候在相加
0000 0001 1 1111 1110 芹晌 2的补码1111 1111 是不是就是-1
-1 源码1000 00011111 1110 反码1111 1111 补码用补码的原因就是因为可以大大节约计算机的资源
8 数据的取值范围
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)