c - 有符号整数模无符号整数会产生无意义的结果

标签 c modulo mod signedness

我需要在 C 中执行一个真正的数学模运算。对我来说,对于 moduled 参数允许负数是有意义的,因为我的模计算会产生负的中间结果,必须将其放回最小残留系统。但是允许负模块是没有意义的,因此我写了

unsigned int mod( int x, unsigned int m )
{
    int r = x % m;
    return r >= 0 ? r : r + m;
}

但是用负数和正模块调用这样的函数
printf("%u\n", mod(-3, 11));

产生输出
1

我不明白为什么。你能解释一下吗?

编辑:我知道运算符 % 不同于数学模,我知道它是如何定义正数和负数的。我在问它会为不同的签名做些什么,而不是不同的签名。

最佳答案

clang-Wconversion enabled 清楚地指出了您的错误:

prog.cc:3:15: warning: implicit conversion changes signedness: 'unsigned int' to 'int' [-Wsign-conversion]
    int r = x % m;
        ~   ~~^~~
prog.cc:3:13: warning: implicit conversion changes signedness: 'int' to 'unsigned int' [-Wsign-conversion]
    int r = x % m;
            ^ ~
prog.cc:4:21: warning: operand of ? changes signedness: 'int' to 'unsigned int' [-Wsign-conversion]
    return r >= 0 ? r : r + m;
    ~~~~~~          ^
prog.cc:4:25: warning: implicit conversion changes signedness: 'int' to 'unsigned int' [-Wsign-conversion]
    return r >= 0 ? r : r + m;
                        ^ ~
prog.cc:9:12: warning: implicit conversion changes signedness: 'unsigned int' to 'int' [-Wsign-conversion]
    return mod(-3, 11);
    ~~~~~~ ^~~~~~~~~~~

live example on wandbox

当转换为 unsigned int , -3变成 4294967293 .
4294967293 % 11等于 1 .

关于c - 有符号整数模无符号整数会产生无意义的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43293686/

相关文章:

c - 尝试将 memset() 结构指针指向 0 时出现段错误

c- 链表结构中的类型冲突错误

java - 如果一个数字可以被两个数字整除但不能被 java 中的三分之一整除,我该如何显示它?

mySql 为每 3 条记录选择唯一的编号

Excel - 条件格式 =MOD(ROW(),2)=0

Pthreads、MPI 和 OpenMP 中的 C++

c - 在 MTD 上 lseek 超出 EOF

sequence - 使用正数和负数重复以 -1 到 1 为模的数字

javascript - 模运算符的逆运算是什么

javascript - 如何返回数字 A 除以数字 B 的次数,直到它包含余数?