原码与补码的转换

原码与补码的转换,第1张

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 数据的取值范围


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12529419.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存