仅限c++:0x80000000的一元减号
c++ only: unary minus for 0x80000000
这个问题应该是为语言律师提出的。
假设有符号和无符号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在投票支持重复之前。)
如果在表达式的求值过程中,结果没有在数学上定义,或者不在其类型的可表示值范围内,则行为是未定义的。[注意:大多数现有的C++实现都忽略整数溢出。被零除法、使用零除数形成余数以及所有浮点异常的处理方式因机器而异,通常可通过库函数进行调整。--endnote]
有符号积分类型遵守数学整数的规则,而不添加计算机废话。因此,如果给定的类型不能表示结果数字,那么-std::numeric_limits< signed_type >::min()
将是未定义的行为。
在constexpr
中,实现是拒绝该表达式所必需的,因为作为可诊断规则,任何导致未定义行为的行为都会使常量表达式无效。在这种情况下,该规则是§5.19中的禁止项目之一
--未在数学上定义或不在其类型的可表示值范围内的结果;
在常量折叠中,编译器最有可能插入溢出的值。
- 一元*运算符的操作数是否期望一个 prvalue
- 一元"运算符"未在C++中定义
- 如何解决一元"*"(有"字符")错误的无效类型参数?
- C++11 标准是否保证零值有符号整数的一元减号为零?
- 应用于无符号类型的一元减号运算符
- C2675 一元运算符由错误的作用域引起
- 如何在 std::transform 中使用 std::p ow 作为一元函数?
- 如何解决参数为一元的错误?
- 你能帮我了解重载一元运算符和二进制运算符之间的区别吗?
- 泛型lambda和一元+运算符
- 为什么'auto'不尊重一元减号运算符?
- 在C++中,一元减号运算符如何处理整数文本
- 位集构造函数中的一元按位或折叠
- 错误:一元"*"的类型参数无效(具有"int"):使用 mergesort 计算
- 创建指针是否超过非数组指针的末尾,而不是从 C++17 中的一元运算符和未定义的行为派生?
- 错误 带有模块的一元"*"(具有"int")的类型参数无效
- 为什么我不能定义一元运算符,然后在 MSVC 的模板类中声明具有相同名称的友元二进制运算符?
- 替换包含已弃用的一元函数的自定义模板
- C++一元右折与一元左折,带逗号运算符
- 为什么一元运算符和不需要完整类型?