2015-05-29 55 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

给您带来的不便,非常感谢您的明确和有益的解释,我将在下次尝试相同的方式, –

相关问题