3 回答

TA貢獻1946條經(jīng)驗 獲得超3個贊
陷阱表示是C99(IIRC而不是C89)用來描述適合類型占用空間的位模式的全部術語,但如果用作該類型的值,則觸發(fā)未定義的行為。定義見6.2.6.1p5(6.2.6中的所有內容都有觸角),我不打算在這里引用它,因為它很長而且令人困惑。存在這種位模式的類型被稱為“具有”陷阱表示。沒有類型需要任何陷阱表示,但標準保證不具有陷阱表示的唯一類型是
unsigned char
(6.2.6.1p5,6.2.6.2p1)。該標準給出了陷阱表示的兩個假設示例,這兩個示例都不對應任何真實CPU多年來所做的任何事情,因此我不會將您與它們混淆。陷阱表示的一個很好的例子(也是唯一可以作為您可能遇到的任何CPU上的硬件級陷阱表示的東西)是浮點類型的信令NaN。C99附件F(第2.1節(jié))明確地將信令NaN的行為定義為未定義,即使IEC 60559詳細說明了它們的行為。
值得一提的是,當指針類型都允許有陷阱表示,空指針是不是陷阱表示。如果取消引用或偏移,則空指針僅導致未定義的行為; 對它們的其他操作(最重要的是,比較和復制)是明確定義的。如果僅使用具有陷阱表示的類型讀取陷阱表示,則陷阱表示會導致未定義的行為。(無效但非空指針是否應該被認為是陷阱表示是一個爭論的主題.CPU不會這樣對待它們,但編譯器可能會。)
您顯示的代碼具有未定義的行為,但這是因為指針別名規(guī)則,而不是因為陷阱表示。這是如何將a
float
轉換為int
具有相同的表示(假設,如你所說sizeof(float) == sizeof(int)
)int extract_int(float f){ union { int i; float f; } u; u.f = f; return u.i;}
此代碼在C99中具有未指定(未定義)的行為,這基本上意味著標準不定義生成的整數(shù)值,但是您確實獲得了一些有效的整數(shù)值,它不是陷阱表示,并且不允許編譯器進行優(yōu)化假設你還沒有這樣做。(6.2.6.1節(jié),第7,我的C99的副本可能包括技術corrigienda -我的回憶是,這是在原來的出版物不確定,但改為不確定的TC)。
- 3 回答
- 0 關注
- 447 瀏覽
添加回答
舉報