第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

請教關于陷阱表示。

請教關于陷阱表示。

幕布斯6054654 2019-11-23 16:15:52
陷阱表示。什么是C中的“陷阱表示”(一些例子可能有幫助)?這適用于C ++嗎?鑒于此代碼......float f=3.5;int *pi = (int*)&f;...并假設sizeof(int) == sizeof(float),f并且*pi具有相同的二進制表示/模式?
查看完整描述

3 回答

?
智慧大石

TA貢獻1946條經(jīng)驗 獲得超3個贊

  1. 陷阱表示是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不會這樣對待它們,但編譯器可能會。)

  2. 您顯示的代碼具有未定義的行為,但這是因為指針別名規(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)。



查看完整回答
反對 回復 2019-11-24
?
精慕HU

TA貢獻1845條經(jīng)驗 獲得超8個贊

使用指向int的別名浮點數(shù)的未定義行為。

查看完整回答
反對 回復 2019-11-24
  • 3 回答
  • 0 關注
  • 447 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網(wǎng)微信公眾號