2011-09-07 17 views
4

1. 考慮以下幾點:是>>((sizeof a)* CHAR_BIT)定義,UB還是IDB?

unsigned int a, b; 

b = a >> ((sizeof a) * CHAR_BIT); 

/* or 2nd operand greater than ((sizeof a) * CHAR_BIT) */ 

是,這是定義的,不確定的行爲或實施行爲?

2. 另外另一子問題:

在這種情況下是asigned int它被移位小於其位長度,是限定的簽名比特移位實現或未定義的行爲。在這兩種情況下:

  1. 當右移:a >> 5
  2. 當左移:a << 5

EDIT

回答

7

1.

問題編輯從C99標準,第6.5.7節:

對每個操作數執行整數提升。結果的類型是 升級左操作數的類型。 如果右操作數的值爲負值或者 大於或等於提升的左操作數的寬度,則的行爲未定義

所以它沒有定義。

2.

,從同樣的部分:

E1 << E2結果是E1左移E2位位置;空位填充零。如果E1具有無符號類型,則結果值爲E1 x 2 E2,比結果類型中可表示的最大值減1多一個模數。 如果E1具有帶符號的類型和非負值,並且E1 x 2 E2可以在結果類型中表示,那麼這就是結果值;否則,行爲是不確定的。

E1 >> E2的結果是E1右移E2位位置。如果E1具有無符號類型或如果E1具有符號類型和具有非負值,則結果的值是E1/2 E2的商的整數部分。如果E1具有帶符號的類型和負值,則結果值爲實現定義的

因此對於左移,如果a是有符號且正確的,則它是明確定義的。如果a已簽名並且爲負,則不確定。

對於右移,如果a是有符號的並且是正值,則它是明確定義的。如果a已簽名且爲負,則爲實施定義。

+0

你可以在問題2中說明一些情況嗎? – phoxis

+1

@phoxis:查看更新的答案。 –

+0

@油查爾斯沃斯:優秀。我應該保留一份標準的副本,它的寫法如此清晰。非常感謝你的答案。 – phoxis

相關問題