3962|9

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

计算无符号数和带符号数,用的是同一个硬件模块吗? [复制链接]

int a, b;
unsigned a2, b2;
计算 a+b和计算a2+b2用的是同一套硬件模块吗?

学计算机组成,里面的ALU貌似采用的就是补码运算啊,
a2 + b2计算时,最高位是无符号的啊???

还有单片机上的浮点计算硬件和整形计算硬件有什么区别?
组成上根本没提到浮点计算硬件。。。。
能介绍下浮点计算硬件的实现吗?

最新回复

以下是我在vs 2005上的测试代码。 #include using namespace std; void main() {         int i = -2;         unsigned int j = 1;         cout   详情 回复 发表于 2009-9-21 23:07
点赞 关注

回复
举报

74

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
能介绍下浮点计算硬件的实现吗?

我只知道,单片机上的浮点运算是通过软件来实现浮点运算

具体的可以看IEEE里对浮点数在计算机里的表示及运算标准

以前一个朋友说过,我没有去深究

嘿嘿
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
浮点运算。。
有时觉着还和编译器有关。
以前有几个芯片用KEIL C编译完的程序
浮点运算总是不正确。。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

4
 
是的,-b = ~b + 1
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 jnwsh 的回复:
是的,-b = ~b + 1

这个是补码运算的式子吧,那么unsigned a + unsigned b
假设a, b对应寄存器 $1, $2
那么对应的指令是什么?
add $res, $1, $2
显然是不合适的,因为这是补码运算。。。
那么 这里无符号数的指令是什么?
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

6
 
无符号相加,用的指令应该是addu吧?
呵呵,计算机组成立学到的加法器,貌似就是没有符号的。。。
通常用于地址计算。

那么补码加法器是如何实现的呢?
如 -2 的补码在32位加法器中的表示是 11111111 11111111 11111111 11111110。
。。。
若作为无符号数,则是一个相当大的数。
int i = -2;
unsigned int j = 1;
i + j 应该是一个很大的正数。。。

最后的输出是 11111111 11111111 11111111 11111111。
如果是通过补码加法器,那算出来的结果应该是-1啊。。。。

通过程序语言算出来的怎么是一个 很大的正数呢?

大家能否解释下中间的详细过程?
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

7
 
补码加法根本不需要考虑符号.....
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

8
 
32位全1,是一个最大的无符号数,如果把它看作有符号数,它就是-1
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(中级)

9
 
ALU不需要区分有符号或无符号,但CPU可以根据不同指令设置不同的标志
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

10
 
以下是我在vs 2005上的测试代码。
#include
using namespace std;
void main()
{
        int i = -2;
        unsigned int j = 1;
        cout << i + j;   // C语言是静态类型语言,所以变量的类型在编译时就可以确定。在便是时编译器会自动把i的类型变为 unsigned int(原来类型是int)
}
最后输出结果是 4294967295

以下是生成的汇编代码。(不知道vs2005上生成的汇编,是否就是实际的机器指令?)

#include
using namespace std;
void main()
{
00411390  push        ebp  
00411391  mov         ebp,esp
00411393  sub         esp,0D8h
00411399  push        ebx  
0041139A  push        esi  
0041139B  push        edi  
0041139C  lea         edi,[ebp-0D8h]
004113A2  mov         ecx,36h
004113A7  mov         eax,0CCCCCCCCh
004113AC  rep stos    dword ptr es:[edi]
        int i = -2;
004113AE  mov         dword ptr ,0FFFFFFFEh // 确实把-2存到 寄存器了,这里使用的是补码
        unsigned int j = 1;
004113B5  mov         dword ptr [j],1          // 这个不知道是什么码,应该也是采用补码吧
        cout << i + j;
004113BC  mov         eax,dword ptr
004113BF  add         eax,dword ptr [j]        // 这里做加法了
004113C2  mov         esi,esp
004113C4  push        eax  
004113C5  mov         ecx,dword ptr [__imp_std::cout (41828Ch)]
004113CB  call        dword ptr [__imp_std::basic_ostream >::operator<< (418290h)]
004113D1  cmp         esi,esp
004113D3  call        @ILT+305(__RTC_CheckEsp) (411136h)
}
004113D8  xor         eax,eax
004113DA  pop         edi  
004113DB  pop         esi  
004113DC  pop         ebx  
004113DD  add         esp,0D8h
004113E3  cmp         ebp,esp
004113E5  call        @ILT+305(__RTC_CheckEsp) (411136h)
004113EA  mov         esp,ebp
004113EC  pop         ebp  
004113ED  ret              

最后的值是 11111111 11111111 11111111 11111111
为什么输出不是-1,而是4294967295,从汇编指令好像也看不出什么啊?
有牛人可以从这汇编代码看出些东西吗?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表