簡體   English   中英

聯盟和位屏蔽,這是如何工作的?

[英]Union and bit masking, how does this work?

這是一些C代碼:

float phaseFrac(unsigned int inPhase)
{
    union { unsigned int itemp; float ftemp; } u;
    u.itemp = 0x3F800000 | (0x007FFF80 & ((inPhase)<<7));
    return u.ftemp - 1.f;
}

我不能在這里圍繞“聯盟”的使用。 我是否正確地認為,由於uint和float都是32位,因此結合中的結果位模式被重新解釋為浮點值? 或者這里有其他魔法嗎?

謝謝...

對,那是正確的。 聯合就像一個結構,除了所有數據成員都重疊存儲,所以如果你寫一個類型的字段,然后讀回一些其他類型的字段,它將重新解釋第一種類型的位作為第二種類型的值類型。

這里的代碼看起來很奇怪,因為聯合是在函數內部定義的。 通常,人們會在文件范圍內聲明一個聯合,就像聲明一個結構一樣,但是這里因為目標是位錯誤而不是數據存儲,所以它是在本地完成的。

從技術上講,它調用未定義的行為:訪問聯合的不同成員而不是最后修改的成員。 但是,大多數C編譯器都會按照您的想法進行操作,並將位模式解釋為浮點數,而現在大多數人都使用IEEE格式浮點數。

不,你是對的。 float和int是32位。 我的猜測是,如果你試圖將0x3F800000分配給一個浮點數,就像分配1065353216一樣,它有一個完全不同的位配置保存為浮點數,這可以解釋為什么需要int。

需要浮點數來獲得一個特殊的效果,減去1,你不會因為同樣的原因從int減去1。

對於類似於您的問題的示例,這應該證明是有用的:

http://courses.missouristate.edu/KenVollmar/publications/CCSCWeb.doc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM