c only:一元减去0x80000000
据推测,这个问题适用于语言律师.
假设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) (请在投票前查看https://meta.stackexchange.com/questions/123713/is-splitting-a-question-a-good-practice副本.) 解决方法
据我所知,有符号整数溢出总是未定义的.从C规范第5节表达式,第4段:
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |