C語言 負資料強制型別轉換注意事項

2021-10-24 17:05:02 字數 1001 閱讀 5567

問題:這幾天寫**時候遇到乙個問題,因為一些便於資料處理的需求。需要將乙個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後正好執行了...