背景:
我在玩位級編碼(這不是家庭作業 - 只是好奇)。我在網上和一本名爲Hacker's Delight的書中發現了很多很好的材料,但是我遇到了一個在線問題。C位浮點轉換意外輸出
它要求將整數轉換爲浮點數。我用下面的鏈接作爲參考通過對問題的工作:
How to manually (bitwise) perform (float)x?
How to convert an unsigned int to a float?
http://locklessinc.com/articles/i2f/
問題和問題:
我想我理解的過程不夠好(我想記錄下在評論過程中),但是當我測試它時,我不理解輸出。
測試用例:
float_i2f(2)返回1073741824
float_i2f(3)返回1077936128
我希望看到類似2.0000和3.0000。
我把這個轉換搞亂了嗎?我想也許這是一個內存地址,所以我想也許我錯過了訪問實際編號所需的轉換步驟?或者,也許我打印不正確?我打印我的輸出是這樣的:
printf("Float_i2f (%d): ", 3);
printf("%u", float_i2f(3));
printf("\n");
但我認爲,在C印花方法是罰款,無符號值(我已經習慣了編程的Java)。
感謝您的任何建議。
代碼:
/*
* float_i2f - Return bit-level equivalent of expression (float) x
* Result is returned as unsigned int, but
* it is to be interpreted as the bit-level representation of a
* single-precision floating point values.
* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while
* Max ops: 30
* Rating: 4
*/
unsigned float_i2f(int x) {
if (x == 0){
return 0;
}
//save the sign bit for later and get the asolute value of x
//the absolute value is needed to shift bits to put them
//into the appropriate position for the float
unsigned int signBit = 0;
unsigned int absVal = (unsigned int)x;
if (x < 0){
signBit = 0x80000000;
absVal = (unsigned int)-x;
}
//Calculate the exponent
// Shift the input left until the high order bit is set to form the mantissa.
// Form the floating exponent by subtracting the number of shifts from 158.
unsigned int exponent = 158; //158 possibly because of place in byte range
while ((absVal & 0x80000000) == 0){//this checks for 0 or 1. when it reaches 1, the loop breaks
exponent--;
absVal <<= 1;
}
//find the mantissa (bit shift to the right)
unsigned int mantissa = absVal >> 8;
//place the exponent bits in the right place
exponent = exponent << 23;
//get the mantissa
mantissa = mantissa & 0x7fffff;
//return the reconstructed float
return signBit | exponent | mantissa;
}
你應該使用'%f'格式說明符告訴'printf'將該值解釋爲浮點值。通過使用'%u',你要求它打印一個無符號整數。但是,這可能是由於嚴格別名而導致的未定義行爲,以及將可變參數傳遞給函數的方式。你可能更好地創建一個'float'變量,並使用'memcpy'將結果中的整數位直接複製到float中。字節順序仍然是一個問題。你想走多深? – paddy
它看起來是正確的(我沒有去通過你的計算)。你所看到的是構成IEEE-754單精度浮點數的位的無符號整數*等效值*。你可以創建一個簡單的'float'和'uint32_t'的聯合體,並檢查兩者的輸出以確認。 –
你的代碼是好的,雖然它不輪,只能截斷。 – deamentiaemundi