【发布时间】:2012-03-17 13:49:51
【问题描述】:
这个问题应该是针对语言律师的。
假设 signed 和 unsigned int 都是 32 位宽。如 n3337.pdf 草案 5.3.1.8 中所述,
(-(0x80000000u)) = 0x100000000u-0x80000000u = 0x80000000u
但我找不到问题的答案:signed 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 个案例的 cmets:
编译时常量折叠,例如
-(INT_MIN)constexpr的编译时计算(如果与编译时常量折叠有差异)。
(重复投票前请查看https://meta.stackexchange.com/questions/123713/is-splitting-a-question-a-good-practice。)
【问题讨论】:
-
在发布有关同一主题的其他问题时,链接到上一个问题会很有帮助:unary minus for 0x80000000 (signed and unsigned)
-
@GregHewgill 有一个指向meta.stackexchange.com/questions/123713/… 的链接(也就是说,拆分问题是一种好习惯吗?)它包含指向我之前问题的链接。
标签: c++ standards language-lawyer unary-operator