如何把十六进制数按十进制计算呢?
比如我计算0x3456-0x78,正常的计算结果应该是0x33de,但是现在我想得到的结果是0x3378,就是把十六进制的0x3456和0x78都当成十进制的3456和78计算了,但是最后的结果3378还要在是十六进制的。按我的理解就是把一个十六进制数转换成看着和他一样的十进制(但是肯定是不想当的),然后再把10进制数转换成看着和他一样的十六进制(也是不相等的),大神们帮帮忙吧,没思路啊 直接减就可以啦! 定义一个unsigned inta=0x3456-0x78 就好了 这是什么样的需求?用在哪的?搞不懂。 你写C十进制和十六进制不用去考虑呀,用来显示才要去转换嘛
直接减肯定不行的啊,0x3456-0x78=0x33de,但是我要得到的是0x3378 来源数据莫非是BCD码?把他们各自先直接弄成int算了 可能我表达不清楚,多举几个例子
0x12-0x5=0x0d,但是需要得到0x07;
0x123-0x43=0xe0,但是需要得到0x80;
0x1234-0x345=0xeef,但是需要得到0x889; 你的十进制和十六进制理解得不清楚嘛
3456-78才能等于3378
0X3456-0X78加了X就不可能是3378了, 应该是BCD码计算吧,如果是16进制的话那0x0A-0x08应该等于多少呢 YUZH282 发表于 2013-12-2 11:23
你的十进制和十六进制理解得不清楚嘛
3456-78才能等于3378
0X3456-0X78加了X就不可能是3378了, ...
就是要把十六进制的数当成跟他看起来一样(但是不相等)的十进制计算 好吧 是我看错了我写个给你 就是BCD码啦 就像DS1302里的数据一样
liujian6f 发表于 2013-12-2 11:32
好吧 是我看错了我写个给你 就是BCD码啦 就像DS1302里的数据一样
懂了,谢谢! 楼主,得到11楼的数据后是不可以拿来做计算的了哦. YUZH282 发表于 2013-12-2 11:43
楼主,得到11楼的数据后是不可以拿来做计算的了哦.
不能拿来做计算是什么意思啊? yy8047 发表于 2013-12-2 11:25
应该是BCD码计算吧,如果是16进制的话那0x0A-0x08应该等于多少呢
如果是BCD码就不可能出现 0x0A 至0x0f 的值 那样就计算错误了 liujian6f 发表于 2013-12-2 11:47
如果是BCD码就不可能出现 0x0A 至0x0f 的值 那样就计算错误了
所以才怀疑实际应该是BCD码啊 先从BCD码转换成普通变量,运算后再转换为BCD码输出 懂了 我这就是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]