移位操作右操作数为负数或右操作数大于或等于左操作数的位数,结果为为定义

位移运算警告解析
本文探讨了C++中位移运算符的行为,特别是当右操作数过大时导致的未定义行为,并通过具体示例解释了如何处理这些警告。文中还讨论了不同数据类型下位移操作的结果。

其中1<<63,1<<32这两行有警告:“<<”: Shift 计数为负或过大,其行为未定义

输出:

8
0
0
0
9223372036854775808
-0

为什么会这样呢?查了MSDN文档,

个人理解如下(如有不妥,请指正)

1<<63,编译器用个32位的临时变量,也许是int类型的,移位时超过了31位(结果为为定义的),在vs2008上试验全变为0,因1已被移出去。故1<<63,1<<32为0

而a为64位,a<<63,1移到最高位

还有在double下(最高位为符号位),

0x8000000000000000 为 -0

 0x0000000000000000 为 0   

相关Msdn文档如下:

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

The bitwise shift operators are:

  • Right shift (>>)

  • Left shift (<<)

These binary operators have left-to-right associativity.

Both operands of the shift operators must be of integral types. Integral promotions are performed according to the rules described in Integral Promotions. The type of the result is the same as the type of the left operand. The value of a right-shift expression e1 >> e2 is e1 / 2e2, and the value of a left-shift expression e1 << e2 is e1 * 2e2.

 

The results are undefined if the right operand of a shift expression is negative or if the right operand is greater than or equal to the number of bits in the (promoted) left operand.

 

The left shift operator causes the bit pattern in the first operand to be shifted left the number of bits specified by the second operand. Bits vacated by the shift operation are zero-filled. This is a logical shift, as opposed to a shift-and-rotate operation.

The right shift operator causes the bit pattern in the first operand to be shifted right the number of bits specified by the second operand. Bits vacated by the shift operation are zero-filled for unsigned quantities. For signed quantities, the sign bit is propagated into the vacated bit positions. The shift is a logical shift if the left operand is an unsigned quantity; otherwise, it is an arithmetic shift.

Microsoft Specific

The result of a right shift of a signed negative quantity is implementation dependent. Although Microsoft C++ propagates the most-significant bit to fill vacated bit positions, there is no guarantee that other implementations will do likewise.

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值