我正在为一种我无法解释的非常奇怪的情况而苦苦挣扎。
基本上我不明白为什么两个十六进制数之间的模数或除法结果是错误的(我正在使用 C
)。
我有一个变量time
这是 32bit unsigned int
它被初始化为 0,然后是其他两个 32bit unsigned ints
, div
和res
,也都初始化为0。
if (time > 0x1388) {
div = time / 0x1388;
res = time - (0x1388 * div);
}
这段代码应该充当time
之间的模运算符。和0x1388
。 Time
是一个变量,当它的值大于 0x1388
时,它会在我的程序中递增。 ,我需要它的余数来做其他计算。
这是一个错误计算值的示例...让我们假设 time
是 0x1770
,大于 0x1388
。 0x1770
之间的划分和0x1388
应该是0x1
( div
) 并提醒 0x3E8
(res
)。
问题是执行这段代码后,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
}
此函数在其他计算之间被 main 多次调用(不涉及 time
、 div
或 res
)。
如果有人能帮助我,我将不胜感激!
最佳答案
使用以下程序我得到了良好的输出:
#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/