划分十六进制数时的奇怪行为

时间:2016-09-14 23:42:36

标签: c hex division modulus unsigned-integer

我正在努力解决一个我无法解释的非常奇怪的情况 基本上我不明白为什么两个十六进制数之间的模数或除法的结果是错误的(我使用C)。

我有一个time变量32bit unsigned int,它被初始化为0,然后是其他两个32bit unsigned intsdivres ,两者都初始化为0。

if (time > 0x1388) {
    div = time / 0x1388;
    res = time - (0x1388 * div);
}

这段代码应该充当time0x1388之间的模数运算符。 Time是一个变量,它在我的程序周围递增,当它的值大于0x1388时,我需要其余的进行其他计算。

这是计算值错误的示例...假设time0x1770,大于0x13880x17700x1388之间的划分应为0x1div),并提醒0x3E8res)。 问题是,执行此代码后,div始终为0x0FFFFF而不是0x1,而res会获得非常奇怪的值。

我已经尝试使用模数,但结果是一样的。有人可以解释一下我在做什么吗? 也许这与我使用unsigned ints的事实有关?如果是这样,请告诉我在使用unsigned ints时需要注意哪些操作?

编辑:尝试添加更多代码...
file1.c中

unsigned int res = 0, div = 0, time = 0; // global variables
unsigned int valueChecker() {
    if (time > 0x1388) {
        div = time / 0x1388;
        res = time - (0x1388 * div);
    }
    return res;
}

在特定时间后定期调用此函数

fileB.c

extern unsigned int time;

void calculate() {
    // do some stuff
    time += getHEXTime(); // this function has been supplied and return time as an HEX number
    // do other stuff
}

此函数主要在其他计算之间多次调用(不涉及timedivres

如果有人可以帮助我,我会非常感激!

1 个答案:

答案 0 :(得分:1)

使用以下程序,我得到了很好的输出:

#include <stdio.h>

unsigned int res = 0, div = 0, time = 0x1300; // global variables
unsigned int valueChecker() {
    if (time > 0x1388) {
        div = time / 0x1388;
        printf( "Div: %u\n", div );
        res = time - (0x1388 * div);
        printf( "Mod: %u\n", res );
    }
    return res;
}

int main(void) {
    while( time < 0x1390 )
    {
        time += 1;
        valueChecker();
    }
    return 0;
}

输出:

Div: 1
Mod: 1
Div: 1
Mod: 2
Div: 1
Mod: 3
Div: 1
Mod: 4
Div: 1
Mod: 5
Div: 1
Mod: 6
Div: 1
Mod: 7
Div: 1
Mod: 8

这意味着问题很可能是extern unsigned int time。 要尝试解决此问题,请执行以下操作:

确保您的内部全局变量声明为static,因此其他模块不会意外地修改它们:

static unsigned int res = 0;
static unsigned int div = 0;

确保所有多单元符号都有一个非常独特的名称,以防万一:

unsigned int global_hexTime = 0;

当我执行以下操作时:

#include <stdio.h>
#include <stdlib.h>

extern unsigned int time;
/* i had to rename div because it was already in stdlib.h! */
static unsigned int res = 0, divisor = 0; // global variables
unsigned int valueChecker() {
    if (time > 0x1388) {
        divisor = time / 0x1388;
        printf( "Div: %u\n", divisor );
        res = time - (0x1388 * divisor);
        printf( "Mod: %u\n", res );
    }
    return res;
}

int main(void) {
    int i = 0;
    while( i < 100 )
    {
        i += 1;
        valueChecker();
    }
    return 0;
}

输出非常糟糕:

Div: 510868
Mod: 863
Div: 510868
Mod: 863
Div: 510868
Mod: 863
Div: 510868
...

这个问题肯定与外部导入和使用全局符号有关。 确保您始终阅读并修复警告。