You*_*008 2 c modulo signedness mod
我需要在C中执行一个真正的数学模.我有理由允许模数参数的负数,因为我的模块计算会产生负中间结果,必须将其放回到最少残留系统中.但是,我写道,允许负面模块是没有意义的
unsigned int mod( int x, unsigned int m )
{
int r = x % m;
return r >= 0 ? r : r + m;
}
Run Code Online (Sandbox Code Playgroud)
然而,使用负数和正模块调用此类函数
printf("%u\n", mod(-3, 11));
Run Code Online (Sandbox Code Playgroud)
产生输出
1
Run Code Online (Sandbox Code Playgroud)
我不明白为什么.你能解释一下吗?
编辑:我知道运算符%与数学模数不同,我知道如何定义正数和负数.我问的是它会为不同的签名做些什么,而不是不同的标志.
clang与-Wconversion启用明确查明你的错误:
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);
~~~~~~ ^~~~~~~~~~~
Run Code Online (Sandbox Code Playgroud)
转换为unsigned int,-3成为4294967293.
4294967293 % 11等于1.
| 归档时间: |
|
| 查看次数: |
504 次 |
| 最近记录: |