3 回答

TA貢獻1835條經驗 獲得超7個贊
對于負操作數,<<
具有未定義的行為,其結果>>
是實現定義的(通常為“算術”右移)。<<
并且>>
在概念上不是按位運算符。它們是算術運算符,等同于對其明確定義的操作數乘以2或乘以適當的冪。
對于真正的位運算符^
,~
,|
,和&
,它們在(可能促進)類型操作數的值的位表示操作。對于帶符號表示形式的每個可能選擇(二進制補碼,1補碼或符號幅度),其結果都得到了很好的定義,但在后兩種情況下,如果實現將“負零”視為實現,則結果可能是陷阱表示形式表示為陷阱。就我個人而言,我幾乎總是將無符號表達式與按位運算符一起使用,以使結果在值(而非表示形式)方面100%定義明確。
最后,請注意,此書面答案僅適用于C.C和C ++是非常不同的語言,盡管我不太了解C ++,但我理解它在某些方面可能與C有所不同。

TA貢獻1801條經驗 獲得超16個贊
<<
負值向左移動具有不確定的行為;>>
負值的右移給出了實現定義的結果;的結果
&
,|
和^
運營商在值的按位表示來定義的。允許用C表示負數的三種可能性:二進制補碼,二進制補碼和符號幅度。當這些運算符用于負值時,實現所使用的方法將確定數值結果。
請注意,帶符號位1和所有值位為零的值(用于二進制補碼和符號幅度),或帶符號位和所有值位為1的值(對于1的補碼)被明確允許為陷阱表示,在這種情況下如果您對這些運算符使用了會生成此類值的參數,則行為是不確定的。

TA貢獻1848條經驗 獲得超6個贊
C89標準根據位位置定義了左移帶符號數字的行為。如果有符號和無符號類型都沒有填充位,則無符號類型所需的行為,再加上正符號類型與無符號類型共享相同表示的要求,將意味著符號位緊靠最高有效位的左側。 。
在C89中,對于沒有填充位的二進制補碼實現,-1 << 1為-2,對于沒有填充位的二進制補碼實現為-1 << 1。如果存在任何沒有填充位的符號幅度實現,則-1 << 1將等于2。
C99標準將負值的左移更改為“未定義行為”,但是從原理上沒有任何線索可以說明原因(甚至根本沒有提及更改)。C89要求的行為在某些補碼實現中可能不理想,因此允許這些實現自由選擇更好的東西是有意義的。我沒有證據表明該標準的作者并不打算讓質量為2的補碼實現繼續提供C89所要求的相同行為,但是不幸的是,他們實際上并未這么說。
- 3 回答
- 0 關注
- 1329 瀏覽
添加回答
舉報