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 ...爲什麼?
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 ...爲什麼?
short ab = 0x8400;
假設short
爲16位,該值0x8400
(十進制33792)不能被表示爲short
,所以你有溢出。嚴格來說,存儲在ab
中的值是實現定義的。實際上,存儲的實際值可能是33792 - 2 或-31744
。
WORD val = ab;
假設WORD
爲unsigned short
一個typedef(因爲它是在Windows上),這個轉換的ab
,-31744
值,從short
到unsigned short
。結果是33792
或0x8400
。但這是無關緊要的,因爲您從不使用val
的值。
INT val1 = ab;
我假設INT
是int
一個typedef。我不知道你爲什麼要使用這樣的typedef。如果INT
總是與int
相同,則使用INT
而不是int
沒有意義。如果INT
可能不是int
,那麼這是一個可怕的誤導性名稱。
無論如何,這只是將ab
的值從short
轉換爲int
。由於該值-31744
在int
的範圍內,因此轉換保留該值,因此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 documentation,WORD
是一個16位無符號類型,爲unsigned short
的typedef。
WORD devId = 0x8400;
這設置devId
到0x8400
,或十進制33792
。這是在WORD
(0到65535)中表示的值的範圍內,所以目前沒有問題。
int a = devId;
假設int
是32位,則值33792
隱式轉換從WORD
到int
。由於它在int
的值範圍內,轉換保持相同的值,因此a
將等於33792
或0x8400
。
如果您使用十六進制檢查a
作爲32位數量,它應該看起來像0x00008400
。
(如果int
爲16位,則的33792
轉換從WORD
到int
會,嚴格地說,產率實現定義的結果。這是非常可能的是該結果將是-31744
。當觀察爲一個無符號16-位數量,它應該看起來像0x8400
,但它不太可能你正在使用16位int
的系統。如果是,請更新你的問題說清楚。)
那麼,爲什麼是你看到的不正確值0xffff8400
?我不知道。我只能猜測你用來打印a
值的代碼是不正確的 - 或者定義和初始化a
的代碼不是你向我們展示的。
如果您更新您的問題以向我們展示如何印刷
0xffff8400
,最好作爲
Short, Self Contained, Correct (Compilable), Example的一部分,我們可以提供幫助。否則,我只能說你做錯了什麼。
我已經修改了這個問題,提到了一個例子,對於由於我之前的例子 –
給您帶來的不便,非常感謝您的明確和有益的解釋,我將在下次嘗試相同的方式, –
http://en.wikipedia.org/wiki/Sign_extension – Quentin
如果您不希望最高位是符號位,請使用無符號數。 – stark
「只有0x8400前面有00,後面有這個值」 - 「這個值」 - 是指*哪個值*? 'devId'或'a'? – WhozCraig