我有以下代碼:是分配數量太大的位域表示未定義行爲
#include <stdio.h>
#include <stdint.h>
enum nums {
ONE,
TWO,
TWENTY = 20
};
struct field {
uint32_t something : 4;
uint32_t rest : 28;
};
int main(void) {
struct field f;
f.something = TWENTY;
return 0;
}
在運行RTEMS 4.9.1一個PowerPC 8241,使用MinGW GCC 3.4.5(我編譯知道它的舊)這段代碼會導致段錯誤。我確定的原因是,我們正在設置一個大的數字來表示一個位字段的位字段。由於我們有4位,它應該只能表示0 - > 15,事實上,當我們用這些數字設置它時,它工作正常。任何以上和它崩潰。我無法複製此行爲here,所以我的問題是:
是這樣的未定義的行爲?如果是這樣,是否有涵蓋它的c標準中的參考?
還是更可能只是一個錯誤,因爲我們的很老舊的編譯器?
這將是有趣與'-S'標誌編譯查看生成的彙編語言。 – lurker
@ lurker,大概可以安排... –
這個問題已經在這裏解答:http://stackoverflow.com/questions/2151305/gcc-warning-large-integer-implicitly-truncated-to-unsigned-type#2151321 。如果向GCC添加'-Werror'標誌,那麼應該預期輸出結果爲:'錯誤:大整數隱式截斷爲無符號類型[-Werror = overflow] f.something = TWENTY;' – BufferOverflow