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