1.补码二进制00011111-01111111怎么算?
2.21çåç ï¼è¡¥ç ï¼åç
3.计算机原码反码补码问题和进制转换
补码二进制00011111-01111111怎么算?
1、正数的码代码补码表示:
正数的补码 = 原码
负数的补码 = { 原码符号位不变} + { 数值位按位取反后+1} or
= { 原码符号位不变} + { 数值位从右边数第一个1及其右边的0保持不变,左边安位取反}
以十进制整数+和-为例:
+原码 = _b
+补码 = _b
-原码 = _b
-补码 = _b
2、纯小数的码代码原码:
纯小数的原码如何得到呢?方法有很多,在这里提供一种较为便于笔算的码代码本地云播放源码方法。
以0.为例,码代码通过查阅可知其原码为0.___b。码代码
操作方法:
将0. * 2^n 得到X,码代码其中n为预保留的码代码小数点后位数(即认为n为小数之后的小数不重要),X为乘法结果的码代码整数部分。
此处将n取,码代码得
X = d = ___b
即0.的码代码jd点选源码二进制表示在左移了位后为___b,因此可以认为0.d = 0.___b 与查询结果一致。码代码
再实验n取,码代码得
X = d = __b 即 0.d = 0.__b,码代码在忽略位小数之后的码代码位数情况下,计算结果相同。FFH源码补码
3、纯小数的补码:
纯小数的补码遵循的规则是:在得到小数的源码后,小数点前1位表示符号,从最低(右)位起,找到第一个“1”照写,之后“见1写0,见0写1”。
以-0.为例,html惊喜源码其原码为1.___b
则补码为:1.___b
当然在硬件语言如verilog中二进制表示时不可能带有小数点(事实上不知道哪里可以带小数点)。
4、一般带小数的补码
一般来说这种情况下先转为整数运算比较方便
-.为例,经查询其原码为_.___b
笔算过程:
-. * 2^ = - = _____b,其中小数点在右数第位,多个patch源码与查询结果一致。
则其补码为_____b,在此采用 负数的补码 = { 原码符号位不变} + { 数值位按位取反后+1} 方法
5、补码得到原码:
方法:符号位不动,幅度值取反+1 or符号位不动,幅度值-1取反
-.补码 = _(.)___b
取反 = _(.)___b
+1 = _(.)___b 与查询结果一致
6、补码的拓展:
在运算时必要时要对二进制补码进行数位拓展,此时应将符号位向前拓展。
-5补码 = 4'b = 6'b_
ps.原码的拓展是将符号位提到最前面,然后在拓展位上部0.
-5原码 = 4‘b’ = 6'b_,对其求补码得6'b_,与上文一致。
çåç ï¼è¡¥ç ï¼åç
å¨è®¡ç®æºä¸ï¼æ°å¼ç表示æ¹å¼é常æä¸ç§ï¼åç ãåç åè¡¥ç ã以ä¸æ¯çåç ãåç åè¡¥ç 表示ï¼
1. åç 表示ï¼åç å°±æ¯å°ä¸ä¸ªæ°å¼çç»å¯¹å¼è½¬æ¢ä¸ºäºè¿å¶å½¢å¼ï¼ç¶åå¨æåé¢å ä¸ä¸ä½ç¬¦å·ä½ï¼0表示æ£æ°ï¼1表示è´æ°ï¼ï¼å¾å°çäºè¿å¶æ°å°±æ¯åç ã
çåç æ¯ï¼
2. åç 表示ï¼æ£æ°çåç ä¸å ¶åç ç¸åï¼è´æ°çåç æ¯å¯¹å ¶åç 符å·ä½ä¸åï¼å ¶ä½åä½ååå¾å°çã
çåç æ¯ï¼ ï¼å 为æ¯æ£æ°ï¼æ以åç ååç ç¸åï¼
3. è¡¥ç 表示ï¼æ£æ°çè¡¥ç ä¸å ¶åç ç¸åï¼è´æ°çè¡¥ç æ¯å¨å ¶åç çåºç¡ä¸å 1å¾å°çã
çè¡¥ç æ¯ï¼ ï¼å 为æ¯æ£æ°ï¼æ以补ç ååç ç¸åï¼
计算机原码反码补码问题和进制转换
1首先了解 低字节位 和高字节位 看图2字节在内存的排列方式
//int num = ; //0开头代表 8禁止 //("%d",num); //所以打印的是8 int num = 0x; //将占 2 位 printf("%p", &num); /* 要特别 注意 低位 在低字节 高位 高字节 0xFAC0 x 0xFAC1 V 0xFAC2 4 0xFAC3 . */ 看图2
3 printf 不会进行自动转换 void main(){ printf("%d", .3); printf("\n%f", );
getchar();}
请看图3
4 一定要注意数据会溢出数据会溢出请看图4
unsigned short num = ; printf("我有现金:%d元",num);
unsigned short num = +1; printf("我有现金:%d元",num);
上面这样数据就会溢出
5 原理
头文件#include<limits.h> printf("%d", INT_MAX); printf("\n%d", INT_MIN); printf("\n%u", UINT_MAX); //有负号的情况下 0代表正式 1代表负数 // //
6源码反码补码
//1的源码和-1的源码 // // //-1符号为是1
源码反码补码过程//源码
//-1反码1 符号位不变 所有0变1 1变0//
//-1补码 符号位不变 所有0变1 1变0 在补1(在反码基础是+1)// unsigned int num = -1; printf("%d %u", num, num);
虽然补码后二进制相同 但是他们有负号的符号位不算 所以数据不相同
7为什么要用补码 非常重要!!!
1 (1代表十进制) 2 ( 是2的源码)
如果我们用2的补码 源码
反码(所有位取反 负号不变)
补码(反码基础 +1)
这时候在相加
1 2的补码 是不是就是-1
-1 源码 反码 补码用补码的原因就是因为可以大大节约计算机的资源
8 数据的取值范围