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

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

是否定義了對有符號整數進行按位運算的結果?

是否定義了對有符號整數進行按位運算的結果?

C++ C
慕容3067478 2019-10-19 15:24:59
我知道有>>符號整數的行為可能與實現有關(特別是當左操作數為負時)。怎么樣的人:~,>>,&,^,|?當他們的操作數有符號內建類型(整數short,int,long,long long),都將結果保證是相同的(中位含量),好像他們的類型是無符號的?
查看完整描述

3 回答

?
qq_花開花謝_0

TA貢獻1835條經驗 獲得超7個贊

對于負操作數,<<具有未定義的行為,其結果>>是實現定義的(通常為“算術”右移)。<<并且>>在概念上不是按位運算符。它們是算術運算符,等同于對其明確定義的操作數乘以2或乘以適當的冪。

對于真正的位運算符^~,|,和&,它們在(可能促進)類型操作數的值的位表示操作。對于帶符號表示形式的每個可能選擇(二進制補碼,1補碼或符號幅度),其結果都得到了很好的定義,但在后兩種情況下,如果實現將“負零”視為實現,則結果可能是陷阱表示形式表示為陷阱。就我個人而言,我幾乎總是將無符號表達式與按位運算符一起使用,以使結果在值(而非表示形式)方面100%定義明確。

最后,請注意,此書面答案僅適用于C.C和C ++是非常不同的語言,盡管我不太了解C ++,但我理解它在某些方面可能與C有所不同。


查看完整回答
反對 回復 2019-10-19
?
侃侃爾雅

TA貢獻1801條經驗 獲得超16個贊

  • <<負值向左移動具有不確定的行為;

  • >>負值的右移給出了實現定義的結果;

  • 的結果&,|^運營商在值的按位表示來定義的。允許用C表示負數的三種可能性:二進制補碼,二進制補碼和符號幅度。當這些運算符用于負值時,實現所使用的方法將確定數值結果。

請注意,帶符號位1和所有值位為零的值(用于二進制補碼和符號幅度),或帶符號位和所有值位為1的值(對于1的補碼)被明確允許為陷阱表示,在這種情況下如果您對這些運算符使用了會生成此類值的參數,則行為是不確定的。


查看完整回答
反對 回復 2019-10-19
?
慕勒3428872

TA貢獻1848條經驗 獲得超6個贊

C89標準根據位位置定義了左移帶符號數字的行為。如果有符號和無符號類型都沒有填充位,則無符號類型所需的行為,再加上正符號類型與無符號類型共享相同表示的要求,將意味著符號位緊靠最高有效位的左側。 。

在C89中,對于沒有填充位的二進制補碼實現,-1 << 1為-2,對于沒有填充位的二進制補碼實現為-1 << 1。如果存在任何沒有填充位的符號幅度實現,則-1 << 1將等于2。

C99標準將負值的左移更改為“未定義行為”,但是從原理上沒有任何線索可以說明原因(甚至根本沒有提及更改)。C89要求的行為在某些補碼實現中可能不理想,因此允許這些實現自由選擇更好的東西是有意義的。我沒有證據表明該標準的作者并不打算讓質量為2的補碼實現繼續提供C89所要求的相同行為,但是不幸的是,他們實際上并未這么說。


查看完整回答
反對 回復 2019-10-19
  • 3 回答
  • 0 關注
  • 1329 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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