计算机内部怎么实现加法? 比如12+5我想应该是先把12和5先转换成BCD编码12为(0001 0010)5为(0101)然后怎么加? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://wenku.baidu.com/view/61e623d7360cba1aa811da9f.html参考 计算机只有01,BCD码就是用01来表示十进制数 比如说,12转换到BCD编码是0001 0010,但是转换到二进制是1100我不知道BCD编码和二进制有什么关系,好像两个完全不同的数 要看你从什么层次去解释这个问题。从数字电路的角度看,加法是由全加器和半加器组成的,而全加器、半加器本身是由或门、异或门、与门等组成的。门电路的实现是半导体的性质决定的。从指令一级来说,加法是由加法指令、进位指令、数据存储指令实现的。比如对于x86处理器,它可以实现一个两操作数的指令,addadd eax, ebx;表示把eax和ebx的指令相加,保存在eax里面。同时如果有进位、溢出,会设置eflag寄存器。从代数的角度说,你需要把十进制转化为二进制,你需要使用补码、反码。 简单地介绍下半加器,我们首先可以得到半加器的真值表:a b sum carry0 0 0 0 (0 + 0 = 0)0 1 1 0 (0 + 1 = 1)1 0 1 0 (1 + 0 = 1)1 1 0 1 (1 + 1 = 10)sum = a 异或 b,也就是相等为0,不等为1。carry = a and b,用了一个与门。这是1位加法。我们可以在此基础上构造多位加法,这就需要全加器:a b carry(上一位的进位) sum carry0 0 0 0 0 0 0 1 1 00 1 0 1 00 1 1 0 11 0 0 1 01 0 1 0 11 1 0 0 11 1 1 1 1具体实现你可以自己思考下。 另外我想说的是,如果你使用C++/C#编写如下源代码:int x = 12 + 5;不考虑编译器优化,那么实际上,编译器产生的程序中的12和5已经是二进制了,而不是BCD。 至于十进制转换为2进制,简单说下原理,就是除以2取得余数,比如12 / 2 = 6 mod 06 / 2 = 3 mod 03 / 2 = 1 mod 11 / 2 = 0 mod 1所以12就是1100 那BCD到底有什么用呢?我就是纳闷这个BCD到底有什么作用,举个例子行吗? BCD就是用二进制表示的十进制而已,没有什么用。其实我们经常用一种编码表示另一种编码,比如你可以认为我们写的二进制其实是"DCB",只使用十进制的01表示二进制。再比如,我们可以认为ASCII表其实是256进制编码出来的文字。 关于编码,推荐你看一本书:http://book.douban.com/subject/4822685/很浅显易懂。 关于unicode码的问题 有没有匹配*和?两个通配符的C#方法? 客户端安装不了发布的系统,急!! 求算法(用c#实现 ) 如何让一个treeview控件带checked=true的某一个节点处于选中状态,且不能用鼠标进行操作??? 在winform下的treeview问题。如何绑定3个表?? 一段简单的ado。net连不上数据库 菜鸟求解 如何写该正则表达式? C# 多线程 重载与委托不匹配 痛苦:关于学习c#,asp.net 【求助】如何将 application/octet-stream 转成可见内容 大家来看看这个有关虚函数的问题
比如说,12转换到BCD编码是0001 0010,但是转换到二进制是1100我不知道BCD编码和二进制有什么关系,好像两个完全不同的数
门电路的实现是半导体的性质决定的。从指令一级来说,加法是由加法指令、进位指令、数据存储指令实现的。比如对于x86处理器,它可以实现一个两操作数的指令,add
add eax, ebx;表示把eax和ebx的指令相加,保存在eax里面。同时如果有进位、溢出,会设置eflag寄存器。从代数的角度说,你需要把十进制转化为二进制,你需要使用补码、反码。
a b sum carry
0 0 0 0 (0 + 0 = 0)
0 1 1 0 (0 + 1 = 1)
1 0 1 0 (1 + 0 = 1)
1 1 0 1 (1 + 1 = 10)
sum = a 异或 b,也就是相等为0,不等为1。
carry = a and b,用了一个与门。
这是1位加法。
我们可以在此基础上构造多位加法,这就需要全加器:
a b carry(上一位的进位) sum carry
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 0 1
1 0 0 1 0
1 0 1 0 1
1 1 0 0 1
1 1 1 1 1
具体实现你可以自己思考下。
编写如下源代码:
int x = 12 + 5;
不考虑编译器优化,
那么实际上,编译器产生的程序中的12和5已经是二进制了,而不是BCD。
12 / 2 = 6 mod 0
6 / 2 = 3 mod 0
3 / 2 = 1 mod 1
1 / 2 = 0 mod 1
所以12就是1100
那BCD到底有什么用呢?我就是纳闷这个BCD到底有什么作用,举个例子行吗?
http://book.douban.com/subject/4822685/
很浅显易懂。