六盲星 发表于 2013-12-2 10:54:34

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

比如我计算0x3456-0x78,正常的计算结果应该是0x33de,但是现在我想得到的结果是0x3378,就是把十六进制的0x3456和0x78都当成十进制的3456和78计算了,但是最后的结果3378还要在是十六进制的。
按我的理解就是把一个十六进制数转换成看着和他一样的十进制(但是肯定是不想当的),然后再把10进制数转换成看着和他一样的十六进制(也是不相等的),大神们帮帮忙吧,没思路啊

liujian6f 发表于 2013-12-2 11:02:38

直接减就可以啦! 定义一个unsigned inta=0x3456-0x78 就好了

binaimei2007 发表于 2013-12-2 11:06:19

这是什么样的需求?用在哪的?搞不懂。

YUZH282 发表于 2013-12-2 11:09:06

你写C十进制和十六进制不用去考虑呀,用来显示才要去转换嘛

六盲星 发表于 2013-12-2 11:11:27

直接减肯定不行的啊,0x3456-0x78=0x33de,但是我要得到的是0x3378

albert_w 发表于 2013-12-2 11:14:50

来源数据莫非是BCD码?把他们各自先直接弄成int算了

六盲星 发表于 2013-12-2 11:20:58

可能我表达不清楚,多举几个例子
0x12-0x5=0x0d,但是需要得到0x07;
0x123-0x43=0xe0,但是需要得到0x80;
0x1234-0x345=0xeef,但是需要得到0x889;

YUZH282 发表于 2013-12-2 11:23:32

你的十进制和十六进制理解得不清楚嘛
3456-78才能等于3378
0X3456-0X78加了X就不可能是3378了,

yy8047 发表于 2013-12-2 11:25:07

应该是BCD码计算吧,如果是16进制的话那0x0A-0x08应该等于多少呢

六盲星 发表于 2013-12-2 11:27:31

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

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

liujian6f 发表于 2013-12-2 11:32:23

好吧 是我看错了我写个给你   就是BCD码啦   就像DS1302里的数据一样

六盲星 发表于 2013-12-2 11:38:28

liujian6f 发表于 2013-12-2 11:32
好吧 是我看错了我写个给你   就是BCD码啦   就像DS1302里的数据一样

懂了,谢谢!

YUZH282 发表于 2013-12-2 11:43:56

楼主,得到11楼的数据后是不可以拿来做计算的了哦.

六盲星 发表于 2013-12-2 11:46:43

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

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

liujian6f 发表于 2013-12-2 11:47:59

yy8047 发表于 2013-12-2 11:25
应该是BCD码计算吧,如果是16进制的话那0x0A-0x08应该等于多少呢

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

yy8047 发表于 2013-12-2 12:51:55

liujian6f 发表于 2013-12-2 11:47
如果是BCD码就不可能出现 0x0A 至0x0f 的值   那样就计算错误了

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

qllaoda1 发表于 2013-12-2 13:31:33

先从BCD码转换成普通变量,运算后再转换为BCD码输出

六盲星 发表于 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&0x0F;                                        //大端i,小端i-1
                decimal_long1 += ( (hex_array1>>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&0x0F;                                        //大端i,小端i-1
                decimal_long2 += ( (hex_array2>>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;
        }
}
页: [1]
查看完整版本: 如何把十六进制数按十进制计算呢?