ub

P5354 [Ynoi2017] 由乃的 OJ

寒鸽儿 @ 2022-08-04 01:46:05

一个ub,因此卡了挺久的。

int k = 64;
(1ull << k) - 1;

好像在本机上跑出来是 0(g++11)。 但是

(1ull << 64) - 1

跑出来是 2^{64} - 1 的。


by dk_qwq @ 2022-08-04 05:30:08

捉寒鸽儿(逃


by Loser_King @ 2022-08-04 08:36:46

对于有符号的非负 a,若 a\times 2^b 能以返回类型的无符号版本表示,则将该值转换到有符号后即是 a << b 的值(这使得以 1 << 31 创建 INT_MIN 合法);否则行为未定义。 (C++20 前)

a << b 的值是与 a\times 2^b2^N 同余的唯一值,其中 N 是返回类型中的位数(即进行逐位左移并舍弃移出目标类型的位)。 (C++20 起)


|