問題:這幾天寫**時候遇到乙個問題,因為一些便於資料處理的需求。需要將乙個s32資料(有符號32位)拆成倆u16(無符號位資料儲存),然後使用該資料計算時,又需要轉換成s64(有符號64位計算)。當資料都為正數時候,不會出錯;當資料出現負數時候,總會出現一些奇奇怪怪的錯誤。
現有s32資料型別的數0xffff 0203
,在做處理時候,一開始的做法是:
int32_t dat =
0xffff0203
;parameter[1]
=(dat&
0xffff0000
)>>16;
parameter[2]
= dat;
int64_t temp;
temp =
(int64_t)((
(uint32_t)parameter[1]
)<<16)
| parameter[2]
;
以上這種做法在資料為正數時候完全沒有問題,但是當資料出現為負數時,資料往往相差很大。最後temp
結果會是(s64)0x00000000ffff0203
,也就是被解釋成了乙個正數。如果我們想要使0xffff0203
被解釋為乙個負數,那麼就需要將其最高位的符號位先解釋為符號位再進行型別轉換,。即改為(將uint32_t
改為int32_t
):
int64_t temp;
temp =
(int64_t)((
(int32_t)parameter[1]
)<<16)
| parameter[2]
;
雖然這個問題很小,但有時候還是會被經常忽視。所以需要注意,在進行有符號資料和無符號資料間的轉換時,每轉換一步都要特別注意對符號位的解釋。 c語言強制型別轉換
例子 include輸出結果 the char is p the short is 4464 the int is 70000 the float is 70000.000000 問題 為什麼float 型別的70000 轉成char型變成了 p 首先資料型別本質是什麼?底層硬體最小的儲存單元只有開...
C語言之強制資料型別轉換
1,楔子 2,原始碼舉例 2.1 浮點型別強制轉換成整型 2.2 無符號整型強制轉換成指標型別 強制型別轉換是把變數從一種型別轉為另一種資料型別。語法格式為 type name expression。includeint main void 執行結果 1610612736 亂碼,因為a定義的為flo...
C語言指標強制型別轉換
一 舉例說明 上圖對應函式呼叫為int printf const char fmt,fmt為char 指標型別,所以共佔了32位位元組,但是 fmt執行的是乙個位元組,fmt 執行的是下乙個位元組,fmt得到乙個32位位址,char fmt得到是乙個執行位元組的指標,char fmt 4後正好執行了...