将逐位移位运算符应用于有符号类型:UB和Impl.定义
Applying bitwise shift operators to signed types: UB and Impl. defined
C++03标准告诉我们,将逐位移位运算符应用于有符号类型的结果可以是UB和Impl。定义为负值。我的问题如下:为什么对于运算符<<
,它有未定义的行为,而对于运算符>>
,它只是实现定义的?为什么<<
的结果也不能被定义为实现,这有严格的原因吗
提前谢谢。
根据5.8/2(无可否认,在C++98中,这是我所能访问的):
E1<lt;E2为E1(解释为位模式)左移位的E2位位置;腾空的位被零填充。如果E1有无符号类型,结果的值是E1乘以数量2提升到E2的幂,降低模ULONG_MAX+1,如果E1的类型为unsigned否则为UINT_MAX+1。
从这一点来看,在我看来,它完全适合左移。没有定义的是所使用的有符号值的表示(如twos补码),因此结果的数字值是为负值定义的实现。
这与右移形成对比,其中根据有符号值的表示,空出的比特可以是零或一填充。
相关文章:
- 'string.assign(string.data(), 5)' 是明确定义的还是 UB?
- 使用 CTRP 时,是否访问访问父构造函数 UB 中的子属性?
- 为什么我会收到此错误?无法将 {lb, ub} 从<大括号括起来的初始值设定项列表>转换为 float(**)(float*, int)
- 将空*参数转换为各种类型的参数是UB吗?
- 通过指针恢复对数组的引用.UB与否?
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- 在未初始化的变量上使用复合赋值运算符(+=, ..)不是C++中的UB?
- 使用lock_guard采用的互斥锁会导致 UB 吗?
- qsort 不适用于我的 impl 中的浮点类型。怎么了?
- 模板与常规函数歧义 - UB?
- 是否通过单元化指针UB访问静态类成员
- 是否可以默认使用UB
- QString::utf16(): Is it UB or not?
- 创建自己的owner_ptr类;在传递堆栈或静态分配的地址时如何避免UB?
- 当原始数据是常量时,修改指针指向的位置是 UB 吗?
- 为什么删除void*是UB而不是编译错误?
- C++ - 使用常量引用来延长临时成员,确定还是 UB?
- 在条件运算符中使用对象两次会产生 UB 吗?
- 是否有任何编译器标志可以在下面的代码中用于报告有关 UB 的警告?
- 将逐位移位运算符应用于有符号类型:UB和Impl.定义