ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

c only:一元减去0x80000000

2019-07-29 19:05:05  阅读:206  来源: 互联网

标签:unary-operator c language-lawyer standards


据推测,这个问题适用于语言律师.

假设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副本.)

解决方法:

据我所知,有符号整数溢出总是未定义的.从C规范第5节表达式,第4段:

If during the evaluation of an expression, the result is not mathematically defined or not in the range of representable values for its type, the behavior is undefined. [Note: most existing implementations of C++ ignore integer overflows. Treatment of division by zero, forming a remainder using a zero divisor, and all floating point exceptions vary among machines, and is usually adjustable by a library function. —endnote]

标签:unary-operator,c,language-lawyer,standards
来源: https://codeday.me/bug/20190729/1574366.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有