Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 移位运算符如何处理c+中的负数+; intmain() { int x=-2; cout_C++_Undefined Behavior_Bit Shift - Fatal编程技术网

C++ 移位运算符如何处理c+中的负数+; intmain() { int x=-2; cout

C++ 移位运算符如何处理c+中的负数+; intmain() { int x=-2; cout,c++,undefined-behavior,bit-shift,C++,Undefined Behavior,Bit Shift,根据C标准(6.5.7位移位运算符) 3对每个操作数执行整数提升 结果的类型是提升的左操作数的类型。如果 右操作数的值为负或大于或等于 提升的左操作数的宽度,行为未定义 同样的C++标准(C++ 20,7.6移位算子) …操作数应为整数或无范围枚举类型,且 执行整体升级。结果类型为 提升的左操作数的。如果右操作数 操作数为负数,或大于或等于 提升的左操作数。 在标准中 第118页,第5.8.1节: 如果右操作数为负,则行为未定义,或者 大于或等于提升后的左侧的长度(以位为单位) 操作数 这意味着

根据C标准(6.5.7位移位运算符)

3对每个操作数执行整数提升 结果的类型是提升的左操作数的类型。如果 右操作数的值为负或大于或等于 提升的左操作数的宽度,行为未定义

同样的C++标准(C++ 20,7.6移位算子)

  • …操作数应为整数或无范围枚举类型,且 执行整体升级。结果类型为 提升的左操作数的。如果右操作数 操作数为负数,或大于或等于 提升的左操作数。
  • 在标准中

    第118页,第5.8.1节:

    如果右操作数为负,则行为未定义,或者 大于或等于提升后的左侧的长度(以位为单位) 操作数


    这意味着编译器可以在这里做任何它想做的事情-所有的赌注都是无效的。

    看看移位操作中的正确数字是否为负数,结果是未定义的。但是当我将-2存储在变量中时,它如何不返回垃圾并始终返回明确的答案?@Lower-不是重复的-这个问题指lhs为负数,而这是rhs。未定义的行为意味着任何事情都可能发生,包括矛盾的事情
    int main() 
    {
      int x = -2;
    
      cout << (1<<x) << endl;
    
      cout << (1<<-2) << endl;
    
    }