【问题标题】:Modulus and unsigned integer模数和无符号整数
【发布时间】:2018-07-10 08:38:09
【问题描述】:

我发现以下行为令人惊讶:

int a = -2;
int b = 5;
uint c = 5;
std::cout << a%b << '\n';
std::cout << a%c << '\n';

Output:
-2
4

当涉及comparisons 时,混合有符号和无符号是有问题的 - 运算符% 中是否存在隐藏的比较,或者这里是否发生了其他事情?

【问题讨论】:

  • 请注意,a%b 也可以是 3。它是实现定义的负数天气 % 具有正或负结果。
  • @GoswinvonBrederlow 自 C++11 起没有。
  • @GoswinvonBrederlow 见stackoverflow.com/a/12711070/1264299
  • 该链接未提及天气/必须向 0 或向下舍入。引用的 C++11 部分只说(a/b)*b + a%b is equal to a。至少过去 a / b 在不同的 CPU 上会以不同的方式舍入,并且标准允许这样做。然后 % 会更改以保留提到的相等性。
  • @GoswinvonBrederlow 当它说“对于整数操作数,/ 运算符产生代数商并丢弃任何小数部分”,我理解这意味着截断已完成 - 因此, “四舍五入”为零。

标签: c++ unsigned modulus


【解决方案1】:

假设uint 是一个unsigned 类型不int 更窄,在表达式a % c 的评估中,a 被转换为uint,它将有值-2 + std::numeric_limits&lt;uint&gt;::max() + 1

对于 32 位 uint,该数字为 4294967294,模 5 为 4。

对于 16 位 uint,该数字是 65534,模 5 也是 4。

参考:https://en.cppreference.com/w/c/language/conversion

【讨论】:

  • 谢谢。好的,所以没有比较,但% 会触发相同的转换。你能指出记录的地方吗?
  • @stafusa:我添加了一个几乎代表标准的参考。
  • 啊,好的 - 我搜索了“模数”,然后错过了:“以下算术运算符的参数经过隐式转换以获得共同的实数类型,即执行的计算:二进制算术 *, /, %, +, - "
  • @stafusa:没错!请随意拼凑所有这些并回答您自己的问题。我会赞成。
猜你喜欢
  • 1970-01-01
  • 2013-10-02
  • 1970-01-01
  • 2015-02-17
  • 1970-01-01
  • 2010-09-19
  • 2013-06-02
  • 2013-10-27
  • 1970-01-01
相关资源
最近更新 更多