搜索
bottom↓
回复: 17

如何把十六进制数按十进制计算呢?

[复制链接]

出0入0汤圆

发表于 2013-12-2 10:54:34 | 显示全部楼层 |阅读模式
比如我计算0x3456-0x78,正常的计算结果应该是0x33de,但是现在我想得到的结果是0x3378,就是把十六进制的0x3456和0x78都当成十进制的3456和78计算了,但是最后的结果3378还要在是十六进制的。
按我的理解就是把一个十六进制数转换成看着和他一样的十进制(但是肯定是不想当的),然后再把10进制数转换成看着和他一样的十六进制(也是不相等的),大神们帮帮忙吧,没思路啊

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2013-12-2 11:02:38 | 显示全部楼层
直接减就可以啦! 定义一个unsigned int  a=0x3456-0x78 就好了  

出0入0汤圆

发表于 2013-12-2 11:06:19 | 显示全部楼层
这是什么样的需求?用在哪的?搞不懂。

出0入0汤圆

发表于 2013-12-2 11:09:06 | 显示全部楼层
你写C十进制和十六进制不用去考虑呀,用来显示才要去转换嘛

出0入0汤圆

 楼主| 发表于 2013-12-2 11:11:27 | 显示全部楼层
直接减肯定不行的啊,0x3456-0x78=0x33de,但是我要得到的是0x3378

出0入42汤圆

发表于 2013-12-2 11:14:50 | 显示全部楼层
来源数据莫非是BCD码?把他们各自先直接弄成int算了

出0入0汤圆

 楼主| 发表于 2013-12-2 11:20:58 | 显示全部楼层
可能我表达不清楚,多举几个例子
0x12-0x5=0x0d,但是需要得到0x07;
0x123-0x43=0xe0,但是需要得到0x80;
0x1234-0x345=0xeef,但是需要得到0x889;

出0入0汤圆

发表于 2013-12-2 11:23:32 | 显示全部楼层
你的十进制和十六进制理解得不清楚嘛
3456-78才能等于3378
0X3456-0X78加了X就不可能是3378了,

出0入0汤圆

发表于 2013-12-2 11:25:07 | 显示全部楼层
应该是BCD码计算吧,如果是16进制的话那0x0A-0x08应该等于多少呢

出0入0汤圆

 楼主| 发表于 2013-12-2 11:27:31 | 显示全部楼层
YUZH282 发表于 2013-12-2 11:23
你的十进制和十六进制理解得不清楚嘛
3456-78才能等于3378
0X3456-0X78加了X就不可能是3378了, ...

就是要把十六进制的数当成跟他看起来一样(但是不相等)的十进制计算

出0入0汤圆

发表于 2013-12-2 11:32:23 | 显示全部楼层
好吧 是我看错了  我写个给你   就是BCD码啦   就像DS1302里的数据一样

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-12-2 11:38:28 | 显示全部楼层
liujian6f 发表于 2013-12-2 11:32
好吧 是我看错了  我写个给你   就是BCD码啦   就像DS1302里的数据一样

懂了,谢谢!

出0入0汤圆

发表于 2013-12-2 11:43:56 | 显示全部楼层
楼主,得到11楼的数据后是不可以拿来做计算的了哦.

出0入0汤圆

 楼主| 发表于 2013-12-2 11:46:43 | 显示全部楼层
YUZH282 发表于 2013-12-2 11:43
楼主,得到11楼的数据后是不可以拿来做计算的了哦.

不能拿来做计算是什么意思啊?

出0入0汤圆

发表于 2013-12-2 11:47:59 | 显示全部楼层
yy8047 发表于 2013-12-2 11:25
应该是BCD码计算吧,如果是16进制的话那0x0A-0x08应该等于多少呢

如果是BCD码就不可能出现 0x0A 至0x0f 的值   那样就计算错误了

出0入0汤圆

发表于 2013-12-2 12:51:55 | 显示全部楼层
liujian6f 发表于 2013-12-2 11:47
如果是BCD码就不可能出现 0x0A 至0x0f 的值   那样就计算错误了

所以才怀疑实际应该是BCD码啊

出0入0汤圆

发表于 2013-12-2 13:31:33 | 显示全部楼层
先从BCD码转换成普通变量,运算后再转换为BCD码输出

出0入0汤圆

 楼主| 发表于 2013-12-2 15:24:46 | 显示全部楼层
懂了 我这就是BCD码计算  刚开始我的思路是对的,就是写的时候错了,看了 liujian6f 的程序明白了,现在写完后的程序看看对了吧
/*******************************************************************************
功能:将已知长度的十六进制数组,按照bcd码,执行加法(0)或减法(1)运算
形参:
hex_array1                被减(加)数,计算的结果存入到hex_array1中,并修改实参,
hex_array2                减(加)数;
array_lengh                数组长度,两数组长度必须一致;
sign_temp                运算符号,0表示加法,1表示减法;
输入和输出的大小端格式根据注释修改:修改注释部分,并修改i 或者i-1
现在为: 小端输入,小端输出
*********************************************************************************/
void BCD_Count(u8 *hex_array1,u8 *hex_array2,u8 array_length,u8 sign_temp)
{
        u8 i;
        u32 decimal_long1 = 0;
        u32 decimal_long2 = 0;

//        for( i = 0; i < array_length; i++ )                                                          //大端模式
        for( i = array_length; i > 0; i-- )                                                          //小端模式
        {
                decimal_long1 *= 100;
                decimal_long1 += hex_array1[i-1]&0x0F;                                        //大端i,小端i-1
                decimal_long1 += ( (hex_array1[i-1]>>4) &0x0F )*10;                //大端i,小端i-1
        }
//        for( i = 0; i < array_length; i++ )                                                           //大端模式
        for( i = array_length; i > 0; i-- )                                                          //小端模式
        {
                decimal_long2 *= 100;
                decimal_long2 += hex_array2[i-1]&0x0F;                                        //大端i,小端i-1
                decimal_long2 += ( (hex_array2[i-1]>>4) &0x0F )*10;                //大端i,小端i-1
        }

        if( sign_temp == 0 )
        {
                decimal_long1 += decimal_long2;
        }
        else
        {
                decimal_long1 -= decimal_long2;
        }

        for( i = 0; i < array_length; i++ )                                                        //小端模式
//        for( i = array_length; i > 0; i-- )                                                        //大端模式
        {
                *(hex_array1+i) = decimal_long1%10;                                                //大端i-1,小端i
                *(hex_array1+i) += ((decimal_long1%100)/10)<<4;                        //大端i-1,小端i
                decimal_long1 /= 100;
        }
}
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 14:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表