亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么在32次以上使用時,32位整數的左位移位(<“)不像預期的那樣工作呢?

為什么在32次以上使用時,32位整數的左位移位(<“)不像預期的那樣工作呢?

C++
大話西游666 2019-08-05 09:45:53
為什么在32次以上使用時,32位整數的左位移位(<“)不像預期的那樣工作呢?當我編寫以下程序并使用GNU C+編譯器時,輸出是1我認為這是由編譯器執行的旋轉操作造成的。#include <iostream>int main(){     int a = 1;     std::cout << (a << 32) << std::endl;     return 0;}但從邏輯上說,如果比特寬度溢出,則輸出應該為0。怎么回事?密碼在第一位,http://ideone.com/VPTwj.
查看完整描述

3 回答

?
慕無忌1623718

TA貢獻1744條經驗 獲得超4個贊

在C+中,只有當移動的值小于類型的大小時,才能很好地定義Shift。如果int是32位,那么只有0到,包括31個步驟是很好的定義.

那這是為什么?

如果您查看執行移位的底層硬件,如果它只需要查看值的下五位(在32位情況下),則可以使用較少的邏輯門來實現,而不是必須檢查值的每一點。

評論中對問題的回答

C和C+被設計成在任何可用的硬件上盡可能快地運行。今天,生成的代碼只是一個“Shift”指令,不管底層硬件如何處理指定范圍之外的值。如果語言指定了Shift的行為方式,那么在執行Shift之前,生成的代碼可能必須檢查移位計數是否在范圍內。通常,這會產生三個指令(比較、分支、移位)。(誠然,在這種情況下,這是不必要的,因為班次計數是已知的。)




查看完整回答
反對 回復 2019-08-05
?
弒天下

TA貢獻1818條經驗 獲得超8個贊


根據C+標準,這是未定義的行為:

E1<E2的值為E1左移E2位置;空出位為零填充位。如果E1具有無符號類型,則結果的值為E1×2^E2,減少的模比結果類型中可表示的最大值高。否則,如果E1具有符號類型和非負值,且E1×2^E2在結果類型中可表示,則為結果值;否則,行為是未定義的。.




查看完整回答
反對 回復 2019-08-05
  • 3 回答
  • 0 關注
  • 403 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號