3 回答

TA貢獻(xiàn)1835條經(jīng)驗(yàn) 獲得超7個(gè)贊
對(duì)于負(fù)操作數(shù),<<
具有未定義的行為,其結(jié)果>>
是實(shí)現(xiàn)定義的(通常為“算術(shù)”右移)。<<
并且>>
在概念上不是按位運(yùn)算符。它們是算術(shù)運(yùn)算符,等同于對(duì)其明確定義的操作數(shù)乘以2或乘以適當(dāng)?shù)膬纭?/p>
對(duì)于真正的位運(yùn)算符^
,~
,|
,和&
,它們?cè)冢赡艽龠M(jìn))類型操作數(shù)的值的位表示操作。對(duì)于帶符號(hào)表示形式的每個(gè)可能選擇(二進(jìn)制補(bǔ)碼,1補(bǔ)碼或符號(hào)幅度),其結(jié)果都得到了很好的定義,但在后兩種情況下,如果實(shí)現(xiàn)將“負(fù)零”視為實(shí)現(xiàn),則結(jié)果可能是陷阱表示形式表示為陷阱。就我個(gè)人而言,我?guī)缀蹩偸菍o符號(hào)表達(dá)式與按位運(yùn)算符一起使用,以使結(jié)果在值(而非表示形式)方面100%定義明確。
最后,請(qǐng)注意,此書面答案僅適用于C.C和C ++是非常不同的語言,盡管我不太了解C ++,但我理解它在某些方面可能與C有所不同。

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

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