| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 592 人关注过本帖
标题:不知道算不算软硬结合的问题,对内行来说可能很简单
只看楼主 加入收藏
luyaker
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-8-30
结帖率:0
收藏
已结贴  问题点数:20 回复次数:8 
不知道算不算软硬结合的问题,对内行来说可能很简单
double型有64位。但是我只能每次读取16位,这样的话,我就得把这些位拼接在一起组成一个double型的数。
但是移位相加的方法只适合long型,请问有什么好方法??
另外我想确认一下,double型的64位哪些是符号位,哪些是指数位,非常感谢!
搜索更多相关主题的帖子: double 
2012-08-30 19:22
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:5 
http://en.

C语言的双精度应该是根据这个来的
2012-08-30 20:53
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
怕你看不到 截个图

图片附件: 游客没有浏览图片的权限,请 登录注册

2012-08-30 20:57
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:5 
这个问题,不存在需要了解这种结构的需要呀。

授人以渔,不授人以鱼。
2012-08-30 21:29
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:5 
你给个中文的 成不成。
英文的  我怕啊

我要成为嘿嘿的黑客,替天行道
2012-08-31 05:09
zhu224039
Rank: 8Rank: 8
等 级:贵宾
威 望:17
帖 子:862
专家分:792
注 册:2012-7-29
收藏
得分:0 
这个怎么读双精度     跟一次读几位  一次读几位说的是CPU的数据总线的宽度  没半毛钱的关系

一个字节 是 8位   一个字 是 16位   一个双精度是  64 位 ,你去看下汇编  你就能明白怎么读的了,我这只大概的给你讲一下

CPU 有4个通用寄存器  8086的是16位的  专门用来存数   给DS 数据段, ES 代码段  SS 堆栈段(还应该有个,哎自己的电脑被人拿走了,有几天没摸了)  提供数据的

当然这几个寄存器都是可以直接访问内存的, 但你想想 通用寄存器  一般是用来预读的

64位的 可以用4个通用寄存器存放  一个数 分成位的,有低位和高位之分   64位数据运算,CPU 具体是怎么处理 把低位溢出位加到高位上去,这个我还没学到  汇编我也是刚开始看的
 
读64位的数据,这个和CPU 的寻址是挂钩的    8086 的总线宽度是20位     寻址方式采用 基础地址*16+偏移量 (16进数表示的地址)   通过地址转换器合成这20位   寻址能力是1MB  
你的数据就是这么在内存中被定位的,从基础地址读64位  分几次读就可以了,读了 放通用寄存器

符号位 是由人说的算的, 计算机只认识0 和1    运算是二进制运算,运算出来的是一串 0和 1 的组合  对于计算机给出的 0和1 的组合的意义是  人规定的。

你看到的十进制  是经过软件处理后看到的。

也就是  CPU 是不认识doulb int  float 类型说的是数,代码经过编译后,这些类型说明 只能告诉CPU处理多少位的0 1,他们是参与运算的数据。  这些类型是C语言赋予的意义
也是C语言编译成机器码的一种规则,是伪指令,如果没有这些规则呢,高级语言就没法让计算机运算了

     


我要成为嘿嘿的黑客,替天行道
2012-08-31 05:47
luyaker
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-8-30
收藏
得分:0 
很感谢楼上几位的回答。因为我是用DSP从FPGA里面读数据,所以每次只能读16位。读完了之后变成double型的问题不是很懂,如果是运算的话,那不是有些麻烦,所以来请教各位。我在百度知道里提问了,有个人提供了一种很好的方法。我在他的基础上做了一点改进,我C语言不是很好,大家帮我看看,谢谢!
例如,我想把两个三十二位数(ABCD FFFF和10BC 0000)组合起来,是不是可以用这个程序。
typedef union u{
double v;
unsigned int s[2];//假设此处int型是32位,我的DSP的int是16位
} U;
main()
{
U x;
s[0]=0xABCDFFFF; s[1]=0x10BC0000;
}
那么我想使用者两个数组合起来的double型,就可以使用x.v了。大家看看有没有问题??

[ 本帖最后由 luyaker 于 2012-8-31 09:09 编辑 ]
2012-08-31 09:00
demonleer
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:483
专家分:1225
注 册:2012-6-4
收藏
得分:5 
以下是引用luyaker在2012-8-31 09:00:26的发言:

很感谢楼上几位的回答。因为我是用DSP从FPGA里面读数据,所以每次只能读16位。读完了之后变成double型的问题不是很懂,如果是运算的话,那不是有些麻烦,所以来请教各位。我在百度知道里提问了,有个人提供了一种很好的方法。我在他的基础上做了一点改进,我C语言不是很好,大家帮我看看,谢谢!
例如,我想把两个三十二位数(ABCD FFFF和10BC 0000)组合起来,是不是可以用这个程序。
typedef union u{
double v;
unsigned int s[2];//假设此处int型是32位,我的DSP的int是16位
} U;
main()
{
U x;
s[0]=0xABCDFFFF; s[1]=0x10BC0000;
}
那么我想使用者两个数组合起来的double型,就可以使用x.v了。大家看看有没有问题??



不知道你用的是哪个公司的DSP,我想不是TI就是ST吧,瑞萨的DSP自带的文件中有大量这样的定义,是用来操作寄存器的。

例如有 union str_mtu2 {
unsigned short Word;
struct {
unsigned char H;
unsigned char L;
}BYTE;
}

比如寄存器是16位的,那么我只想设定他的高8位或者低8位的话,可以直接这样 str_mtu2.BYTE.H = 0x01; 如果想一次性设定16位可以 str_mtu2.Word = 0x0101;

你的方法不错。
2012-08-31 09:23
luyaker
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2012-8-30
收藏
得分:0 
回复 8楼 demonleer
谢谢你!这回我就放心了
2012-08-31 10:32
快速回复:不知道算不算软硬结合的问题,对内行来说可能很简单
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018996 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved