c - 除十六进制数时的奇怪行为

标签 c hex division modulus unsigned-integer

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

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

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

这段代码应该充当time之间的运算符。和0x1388Time是一个变量,当它的值大于 0x1388 时,它会在我的程序中递增。 ,我需要它的余数来做其他计算。

这是一个错误计算值的示例...让我们假设 time0x1770 ,大于 0x13880x1770之间的划分和0x1388应该是0x1 ( div ) 并提醒 0x3E8 (res)。 问题是执行这段代码后,div总是0x0FFFFF而不是0x1res得到一个非常奇怪的值。

我已经尝试使用模数,但结果是相同的。有人可以解释一下发生了什么事吗?
也许与我正在使用 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
}

此函数在其他计算之间被 main 多次调用(不涉及 timedivres )。

如果有人能帮助我,我将不胜感激!

最佳答案

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

#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 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
...

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

关于c - 除十六进制数时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39501210/

相关文章:

c# - 您可以在最上面的窗口上启动一个进程吗? (csharp wpf)

windows - BSOD错误代码解释

delphi - Delphi5中浮点除零异常

assembly - 两个数字的 idivl,其中第一个数字小于第二个数字(在汇编中)

html - 将鼠标悬停在列表元素上时更改 div 中的文本

包含函数调用和后增量的表达式中的 C 序列点

c - 链接列表中的元素没有被删除

c - C 中泛型数据类型值的十六进制表示

c - 我如何从 c ( linux ) 中的非文本文件中读取?

python - 如何在两个 matplotlib hexbin 映射之间创建差异映射?