求解答!!! 二进制补码中的计算问题

求解答!!! 二进制补码中的计算问题,第1张

1、正数的补码表示:
正数的补码 = 原码
负数的补码 = {原码符号位不变} + {数值位按位取反后+1} or
= {原码符号位不变} + {数值位从右边数第一个1及其右边的0保持不变,左边安位取反}
以十进制整数+97和-97为例:
+97原码 = 0110_0001b
+97补码 = 0110_0001b
-97原码 = 1110_0001b
-97补码 = 1001_1111b
2、纯小数的原码:
纯小数的原码如何得到呢?方法有很多,在这里提供一种较为便于笔算的方法。
以064为例,通过查阅可知其原码为01010_0011_1101_0111b。
*** 作方法:
将064 2^n 得到X,其中n为预保留的小数点后位数(即认为n为小数之后的小数不重要),X为乘法结果的整数部分。
此处将n取16,得
X = 41943d = 1010_0011_1101_0111b
即064的二进制表示在左移了16位后为1010_0011_1101_0111b,因此可以认为064d = 01010_0011_1101_0111b 与查询结果一致。
再实验n取12,得
X = 2621d = 1010_0011_1101b 即 064d = 01010_0011_1101b,在忽略12位小数之后的位数情况下,计算结果相同。
3、纯小数的补码:
纯小数的补码遵循的规则是:在得到小数的源码后,小数点前1位表示符号,从最低(右)位起,找到第一个“1”照写,之后“见1写0,见0写1”。
以-064为例,其原码为11010_0011_1101_0111b
则补码为:10101_1100_0010_1001b
当然在硬件语言如verilog中二进制表示时不可能带有小数点(事实上不知道哪里可以带小数点)。
4、一般带小数的补码
一般来说这种情况下先转为整数运算比较方便
-9764为例,经查询其原码为1110_00011010_0011_1101_0111b
笔算过程:
-9764 2^16 = -6398935 = 1110_0001_1010_0011_1101_0111b,其中小数点在右数第16位,与查询结果一致。
则其补码为1001_1110_0101_1100_0010_1001b,在此采用 负数的补码 = {原码符号位不变} + {数值位按位取反后+1} 方法
5、补码得到原码:
方法:符号位不动,幅度值取反+1 or符号位不动,幅度值-1取反
-9764补码 = 1001_1110()0101_1100_0010_1001b
取反 = 1110_0001()1010_0011_1101_0110b
+1 = 1110_0001()1010_0011_1101_0111b 与查询结果一致
6、补码的拓展:
在运算时必要时要对二进制补码进行数位拓展,此时应将符号位向前拓展。
-5补码 = 4'b1011 = 6'b11_1011
ps原码的拓展是将符号位提到最前面,然后在拓展位上部0
-5原码 = 4‘b’1101 = 6'b10_0101,对其求补码得6'b11_1011,与上文一致。

这个要看小数按什么格式输入。
如果按%s输入,也就是按字符串格式输入,先找到小数点的位置,然后统计下小数点后数字的长度。
具体实现可参考:
#include <stdioh>
#include <stdlibh>
#include <stringh>
int main(int argc, char argv[])
{
char a[128];
while(scanf("%s",a)!=EOF)
{
if(strstr(a,"")!=NULL)
printf("%d\n",strlen(strstr(a,"")+1));
else
printf("0\n");
}
system("pause");
return 0;
}
如果按%f(对应float类型小数)或者%lf(double类型的小数)方式读入,则需要先去掉整数部分,然后看小数部分一直乘10减去整数部分,知道等于0,统计,乘了几次10,但是由于浮点数在计算机中存的并不是准确值,这个往往得不到正确的结果。可以使用sprintf(str,"%g",f);,然后由于f毕竟不是准确值,还是会出现有些问题,源码如下:
#include <stdioh>
#include <stdlibh>
#include <stringh>
int main(int argc, char argv[])
{
char a[128];
float f;
while(scanf("%f",&f)!=EOF)
{
sprintf(a,"%g",f);
if(strstr(a,"")!=NULL)
printf("%d\n",strlen(strstr(a,"")+1));
else
printf("0\n");
}
system("pause");
return 0;
}
这是最后一个已经出现错误,所以遇到要精确判断小数点的位数,最好直接按字符串读入,这和图灵机的工作原理暗暗相合。

口诀:整数二进制用数值乘以2的幂次依次相加,小数二进制用数值乘以2的负幂次然后依次相加。

1、整数二进制转换为十进制:首先将二进制数补齐位数,首位如果是0就代表是正整数,如果首位是1则代表是负整数。

若二进制补足位数后首位为1时,如下图所示,就需要先取反再换算:

2、小数的二进制转换为十进制:将二进制中的四位小数分别于下边(如下图所示)对应的值相乘后相加得到的值即为换算后的十进制。

扩展资料

二进制和十进制的区别:

1、用处不同:二进制主要用于计算机运算,十进制主要用于日常生活。

2、组成不同:二进制只有两个数字0和1来表示,十进制则是由0,1,2,3,4,5,6,7,8,9十个基本数字组成的数字系统。

3、规则不同:二进制进位规则是“逢二进一”,借位规则是“借一当二”。而十进制基于位进制和十进位两条原则,即所有的数字都用10个基本的符号表示,“满十进一”,同时同一个符号在不同位置上所表示的数值不同,符号的位置非常重要。基本符号是0到9十个数字。要表示这十个数的10倍,就将这些数字右移一位,用0补上空位。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存