首页 > 编程知识 正文

c语言10进制转2进制,单片机C语言代码详细解释

时间:2023-05-04 15:17:32 阅读:144177 作者:2698

1 .在计算机系统中,数值一律用补数表示(存储)。

主要原因:补码可以用于统一处理符号位和其他位; 另外,减法也可以通过加法运算处理。 另外,以补数表示的2个数相加时,如果最高位(符号位)有进位,进位将被废弃。

2、补码和源代码转换过程基本相同。

求给定数值的补数表示,有以下两种情况。

)1)正数补数

和原始代码一样。

【例1】9的补数为00001001。

)2)负数补数

符号位为1、其馀位为该数绝对值的原码逐位反转; 然后在总数上加1。

【例2】求-7的补数。

因为如果给定数为负数,则符号位为“1”。

下七位:取7的原码(0000111 )逐位反转) 1111000 (加1 ) 111000 )

所以-7的补数是11111001。

已知一个数的补数,求源代码的操作可以分为两种情况。

)1)补码的符号位为“0”表示为正数,其原始符号为补码。

)2)如果补码的符号比特为“1”并指示为负数,则所给这个补码的补码是所要求的原始符号。

另一种方法是求负数的补数。

例如求-15的补数

步骤15:00001111

步骤2 :逐位取反(1变为0,0变为1 ),末尾加1。

11110001

再举一个例子验证,求-64的补数

64:01000000

11000000

【例3】已知一个补码为11111001时,原码为10000111(-7 )。

表示符号位为“1”,为负数,所以该位保持“1”。

剩下的7位1111001反转为0000110;

因为是加1,所以是10000111。

“源代码、反码、完成代码”文件中没有提到重要的概念“类型”。 现在,我将稍微介绍一下“型”的概念:

“模式”是指测量系统的计数范围。 例如钟表等。 计算机也可以看成一个测量仪器,它也有一个测量范围。 也就是说,都存在一个“型”。 例如:

时钟的测量范围为0~11,模式=12。

表示n位的计算机测量范围为2^(n )-1,模式2^(n ) )。

“型”实质上是计量器产生“溢出”的量,其值不在计量器上显示,计量器上只显示模具的馀数。 只要是有模子的计量器,就可以把减法加起来作为加法。

例如,假设当前时针指向10点,准确时间为6点,则调整时间有两种拨号方式:

一个是倒退4小时,也就是10-4=6

另一个是顺发8小时: 10 8=12 6=6

在12模式的系统中,加8和减4有同样的效果,所以所有减去4的运算都可以用加8来代替。

对“型”来说,8和4互为补数。 实际上在12模式的系统中,11和1、10和2、9和3、7和5、6和6都具有这一特性。 共同的特点是两者加起来等于模子。

对于计算机,其概念和方法完全相同。 n位计算机,n=8,

可显示的最大数为11111111,加上1为10000000(9位),但由于只有8位,所以最高位1自然会丢失。 由于返回0000000,8位二进制系统的模式为2^8。

在这样的系统中,减法问题也成为加法问题,只要用对应的补数来表示减数就可以了。 补数用于计算机对数的处理是补数。

另外两个概念

的补数(one's complement )是指正数=原码,负数=反码

二补数(two's complement )是指普通补数。

(3) .补数的绝对值(称为真值) ) )。

【例4】-65的补数为10111111

如果将10111111直接转换为十进制数,则为191而不是-65。

实际上,在计算机中,如果二进制数的最左边的位是1,则可以判定为负数,用补码表示。

要获得负二进制绝对值(称为真值),请反转每个位(包括符号位),再加上1即可获得真值。

例如,二进制值: 10111111(-65的补数)。

各位,01000000

加1:01000001(65的补数)。

代数加减运算

1、补数加法

[X Y]补=[X]补[Y]补

【例5】求X=0110011,Y=-0101001,[X Y]补充

[X]候补=00110011 [Y]候补=11010111

[X Y]补=[X]补[Y]补=00110011 11010111=00001010

注:由于计算机中运算器的位长是固定的,上述运算中发生的最高位进位将被舍弃,因此结果不同

不是100001010,而是00001010。

2、补数减法

[X-Y]增补=[X]增补- [Y]增补=[X]增补[-Y]增补

这里,[-Y]互补被称为负互补,而求负互补的方式是使包括已编码比特在内的所有比特逐比特反转; 然后在总数上加1。

【例6】1

+(-1) [十进制]

1的原码00000001 转换成补码:00000001

-1的原码10000001 转换成补码:11111111

1+(-1)=0

00000001+11111111=00000000

00000000转换成十进制为0

0=0所以运算正确。

3、补码乘法

设被乘数【X】补=X0.X1X2……Xn-1,乘数【Y】补=Y0.Y1Y2……Yn-1,

【X*Y】补=【X】补×【Y】补,即乘数(被乘数)相乘的补码等于补码的相乘。

补码的代数解释

任何一个数都可以表示为-a=2^(n-1)-2^(n-1)-a;

这个假设a为正数,那么-a就是负数。而根据二进制转十进制数的方法,我们可以把a表示为:a=k0*2^0+k1*2^1+k2*2^2+……+k(n-2)*2^(n-2)

这里k0,k1,k2,k(n-2)是1或者0,而且这里设a的二进制位数为n位,即其模为2^(n-1),而2^(n-1)其二项展开是:1+2^0+2^1+2^2+……+2^(n-2),而式子:-a=2^(n-1)-2^(n-1)-a中,2^(n-1)-a代入a=k0*2^0+k1*2^1+k2*2^2+……+k(n-2)*2^(n-2)和2^(n-1)=1+2^0+2^1+2^2+……+2^(n-2)两式,2^(n-1)-a=(1-k(n-2))*2^(n-2)+(1-k(n-3))*2^(n-3)+……+(1-k2)*2^2+(1-k1)*2^1+(1-k0)*2^0+1,而这步转化正是取反再加1的规则的代数原理所在。因为这里k0,k1,k2,k3……不是0就是1,所以1-k0,1-k1,1-k2的运算就是二进制下的取反,而为什么要加1,追溯起来就是2^(n-1)的二项展开式最后还有一项1的缘故。而-a=2^(n-1)-2^(n-1)-a中,还有-2^(n-1)这项未解释,这项就是补码里首位的1,首位1在转化为十进制时要乘上2^(n-1),这正是n位二进制的模。

不能贴公式,所以看起来很麻烦,如果写成代数式子看起来是很方便的。

注:n位二进制,最高位为符号位,因此表示的数值范围-2^(n-1) ——2^(n-1)

-1,所以模为2^(n-1)。上面提到的8位二进制模为2^8是因为最高位非符号位,表示的数值范围为0——2^8-1。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。