百科问答小站 logo
百科问答小站 font logo



C++中 int n = 0ULL - 1; 是 UB 未定义行为吗? 第1页

  

user avatar   Kurenai_Misuzu 网友的相关建议: 
      

首先结论:没有未定义行为, C++20 起保证得到 -1 , C++20 前结果为实现定义,但所有已知实现都得到 C++20 起保证的结果。

0ULL - 1 这个表达式中先进行通常算术转换:两边类型分别为 unsigned long long 与 int ,转换到公共类型 unsigned long long 。然后进行无符号整数的算术运算,这里有模算术,结果是 unsigned long long 类型的最大值。定义中最后是转换到 int 。这一步操作从 C++20 起变为唯一定义:整数值转换到宽度为 W 位的另一整数类型值,结果为目标类型中与源类型对 2^W 同余的唯一值。于是结果即 int 类型的 -1 。

C++20 前结果为实现定义(见后述),而已知实现上均得到与 C++20 规则一致的结果。

C++20 起限制了有符号整数必须用补码表示,并且从范围外的值转换到有符号整数类型必须遵循上述规则(等价于截断二进制表示)。之前这两点是实现定义,但已知的 C++ 实现均遵循这些规则( C 的有例外)。


C++20 中确实有关于 UB 的相关改动:减少了有符号整数左移未定义的情况(可以粗略认为变得与无符号整数左移“等价”了)。不过这就与本问题无关了。


user avatar   pansz 网友的相关建议: 
      

低情商:是的,已经结束了。

高情商:diy的时代暂停了,只不过我们暂时不知道重新开放的期限。




  

相关话题

  请问#define PI 3.1416比float pi=3.1416有什么优势呢? 
  深入理解nginx中,第9章中有一句:利用指针的最后一位一定是0的特性。能解释一下这个特性? 
  C++ 学到什么程度才能叫精通? 
  c语言中,关于switch循环的这个疑问怎么解? 
  为何 Boost 的 Asio 要使用 Proactor 模式实现? 
  为什么C++库开发人员都喜欢自己造一个字符串类?你见过性能最好开源字符串类是哪个? 为什么? 
  如何评价Qt6弃用qmake,全面转向CMake? 
  为什么 C++ std::map::operator[] 不提供 const 版本? 
  如何让停留在语法层面的 C++,变成实际工程中的 C++? 
  「C++ 早就过时了,大部分写工程不用 C++,学习这个语言只是为了竞赛」的观点是否正确? 

前一个讨论
程序在编译的时候,会转换成汇编,然后是机器指令,那么运行的时候,操作系统充当什么呢?
下一个讨论
男子收养猫后向原主人索要裸照和钱,遭拒后虐杀猫发给原主人,被拘时已杀 6 猫,男子将承担哪些责任?





© 2024-06-24 - tinynew.org. All Rights Reserved.
© 2024-06-24 - tinynew.org. 保留所有权利