1
我想寫一個定點轉換例程。我需要將兩個值加上一些標誌放入一個8字節的數據包中,所以每個值只有3個字節。爲什麼我的定點轉換爲負非整數關閉1?
我的代碼如下所示:
typedef struct
{
signed short m;
unsigned char f;
} Q16_8;
Q16_8 toQ(double d)
{
Q16_8 q;
q.m = (signed short)d;
q.f = (unsigned char)(d * 256.0);
return q;
}
double toDouble(const Q16_8 q)
{
return q.m + q.f/256.0;
}
我的測試結果是這樣的。其中第1列是浮點數,2是固定點,3是差值。
-2.000000 -2.000000 0.000000
-1.750000 -0.750000 -1.000000
-1.500000 -0.500000 -1.000000
-1.250000 -0.250000 -1.000000
-1.000000 -1.000000 0.000000
-0.750000 0.250000 -1.000000
-0.500000 0.500000 -1.000000
-0.250000 0.750000 -1.000000
0.000000 0.000000 0.000000
0.250000 0.250000 0.000000
0.500000 0.500000 0.000000
0.750000 0.750000 0.000000
1.000000 1.000000 0.000000
1.250000 1.250000 0.000000
1.500000 1.500000 0.000000
1.750000 1.750000 0.000000
我在做什麼錯了?
是不是'X >> 8'相當於'爲x/256'?但是,這個解決方案似乎是正確 – Kupto
@Kupto對[算術轉換](http://en.wikipedia.org/wiki/Arithmetic_shift)做一些研究。你可以嘗試看看[區別](http://ideone.com/ZP5oN4)。 –
由於將值轉換爲負值,此代碼可能存在危險。你可以通過做掩碼等來使這個便攜式。 –