【发布时间】:2017-04-08 16:59:54
【问题描述】:
我花了一些时间浏览这个网站;特别是这个问题:Is ((a + (b & 255)) & 255) the same as ((a + b) & 255)?
这样做,我得出的结论是
int main()
{
unsigned short i = std::numeric_limits<unsigned short>::max();
unsigned short j = i;
auto y = i * j;
}
由于将i 和j 类型提升为int,可能导致未定义的行为,随后在乘法时溢出!也许i 和j 甚至不需要这么大。
我的结论是,例如,在unsigned short 为 16 位且int 为 32 位的系统上,行为可能未定义。
我说的对吗?
【问题讨论】:
-
不,这是定义的行为(witch 变为与
(i*j)%std::numeric_limits<unsigned short>::max()相同的值)而不考虑溢出 -
@apple 不,这是不正确的。
-
很遗憾您不能对评论投反对票。
-
@Yakk @ FitzwilliamBennet-Darcy 你能解释一下为什么它是未定义的吗?我不认为
i和j适合prvalue作为@krzaq 报价 -
@appleapple 他们将首先进行左值到右值的转换。
标签: c++ language-lawyer