2015-05-29 70 views
-1
short ab = 0x8400; 
WORD val = ab; 
INT val1 = ab; 
CString strMsg = _T(""); 
strMsg.Format(_T("value of val1 = %x"), ab); 
AfxMessageBox(strMsg); 

then ab has 0xffff8400 爲什麼? 從哪裏來這0xffff從哪裏來?分配給int類型變量的字變量,它前面有ffff ...爲什麼?

+5

http://en.wikipedia.org/wiki/Sign_extension – Quentin

+0

如果您不希望最高位是符號位,請使用無符號數。 – stark

+0

「只有0x8400前面有00,後面有這個值」 - 「這個值」 - 是指*哪個值*? 'devId'或'a'? – WhozCraig

回答

2
short ab = 0x8400; 

假設short爲16位,該值0x8400(十進制33792)不能被表示爲short,所以你有溢出。嚴格來說,存儲在ab中的值是實現定義的。實際上,存儲的實際值可能是33792 - 2 或-31744

WORD val = ab; 

假設WORDunsigned short一個typedef(因爲它是在Windows上),這個轉換的ab-31744值,從shortunsigned short。結果是337920x8400。但這是無關緊要的,因爲您從不使用val的值。

INT val1 = ab; 

我假設INTint一個typedef。我不知道你爲什麼要使用這樣的typedef。如果INT總是與int相同,則使用INT而不是int沒有意義。如果INT可能不是int,那麼這是一個可怕的誤導性名稱。

無論如何,這只是將ab的值從short轉換爲int。由於該值-31744int的範圍內,因此轉換保留該值,因此ab == -31744

strMsg.Format(_T("value of val1 = %x"), ab); 

假設strMsg.Format類似於printf,所述%x格式說明需要unsigned int類型的參數。 ab類型爲int(當然,INT,但我們假設它是相同的)。這可能會將int對象的內容視爲,它的類型爲unsigned int。結果0xffff8400是我所期望的,如果int是32位,並使用二進制補碼錶示。但是,如果您想查看ab的實際值,請使用正確的格式說明符%d

以下是您的問題的原始版本的答案。您的編輯更改了您正在檢查的變量的代碼和值;原來問題中的代碼與您所報告的結果不一致。

快速概要: a *沒有值 0xffff8400;你可能只是不正確地顯示它。

根據Microsoft's documentationWORD是一個16位無符號類型,爲unsigned short的typedef。

WORD devId = 0x8400; 

這設置devId0x8400,或十進制33792。這是在WORD(0到65535)中表示的值的範圍內,所以目前沒有問題。

int a = devId; 

假設int是32位,則值33792隱式轉換從WORDint。由於它在int的值範圍內,轉換保持相同的值,因此a將等於337920x8400

如果您使用十六進制檢查a作爲32位數量,它應該看起來像0x00008400

(如果int爲16位,則的33792轉換從WORDint會,嚴格地說,產率實現定義的結果。這是非常可能的是該結果將是-31744。當觀察爲一個無符號16-位數量,它應該看起來像0x8400,但它不太可能你正在使用16位int的系統。如果是,請更新你的問題說清楚。)

那麼,爲什麼是你看到的不正確值0xffff8400?我不知道。我只能猜測你用來打印a值的代碼是不正確的 - 或者定義和初始化a的代碼不是你向我們展示的。

如果您更新您的問題以向我們展示如何印刷 0xffff8400,最好作爲 Short, Self Contained, Correct (Compilable), Example的一部分,我們可以提供幫助。否則,我只能說你做錯了什麼。

+0

我已經修改了這個問題,提到了一個例子,對於由於我之前的例子 –

+0

給您帶來的不便,非常感謝您的明確和有益的解釋,我將在下次嘗試相同的方式, –

相關問題