这个问题应该是针对语言律师的。
假设 signed 和 unsigned int 都是 32 位宽。如 n3337.pdf 草案 5.3.1.8 所述,
(-(0x80000000u)) = 0x100000000u-0x80000000u = 0x80000000u
但我找不到问题的答案:签名的0x80000000 的一元减号是什么?是 UB、实现定义还是...?
问题主要是关于运行时计算。
说
signed int my_minus(signed int i) { return -i;}
....
int main() {
signed int a = -0x7FFFFFFF; // a looks like 0x80000001
signed int b = a - 1; // b looks like 0x80000000
std::cout << my_minus(b);
....
}
不过,欢迎您对其他 2 个案例发表评论:
编译时常量折叠,比如说,
-(INT_MIN)
编译时计算
constexpr
(如果与编译时常量折叠有区别)。
(请在为重复投票之前查看https://meta.stackexchange.com/questions/123713/is-splitting-a-question-a-good-practice 。)