C++中整数转换的奇异问题

sunlikerain 2012-08-03 08:34:32

#include "stdafx.h"
#include <Windows.h>


int _tmain(int argc, _TCHAR* argv[])
{
int a = (WORD)2 - (WORD)10;
__int64 c = (WORD)2 - (WORD)10;
int d = (DWORD)2 - (DWORD)10;
__int64 b = (DWORD)2 - (DWORD)10;
return 0;
}

如上:我写了段简单的代码,但是运行结果却是:

a=-8, b=4294967288, c=-8, d=-8

运行平台: win7 32位, VS2008

百思不得其解上面的结果,有高人知道烦请告知下,不胜感谢!!
...全文
125 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
图灵狗 2012-08-06
  • 打赏
  • 举报
回复
楼主非常的不谦虚,别人好心好意的给你解答,不认真看,脾气还挺大!
printf("%d, %lld, %lld, %d\n", a, b, c, d);
关键是上面这句话,请睁大眼睛看清楚%lld的输出方式,没有实验通过,我发出一段代码干嘛。


[Quote=引用 2 楼 的回复:]

你说的不对,请做过实验再来
[/Quote]
sunlikerain 2012-08-05
  • 打赏
  • 举报
回复
我真是服了,请不要教训我,直接回答我的问题最好

下面是我做实验的结果:

我明白不同的数据类型转换时会产生类型转换,总是像精度较高的转换,比如float和double运算时会向double转换

但是,现在问题是:为什么dword向int转换时结果是正确的-8,而dword向__int64转换时,结果却是错误的

这个是我在win7 32位旗舰版, VS2008上测试的结果,结果是没有问题的

我看了汇编,初步估计是和编译器实现的平台相关,

int a = (WORD)2 - (WORD)10;
00411A1E mov dword ptr [a],0FFFFFFF8h
__int64 c = (WORD)2 - (WORD)10;
00411A25 mov dword ptr [c],0FFFFFFF8h
00411A2C mov dword ptr [ebp-14h],0FFFFFFFFh
int d = (DWORD)2 - (DWORD)10;
00411A33 mov dword ptr [d],0FFFFFFF8h
__int64 b = (DWORD)2 - (DWORD)10;
00411A3A mov dword ptr [b],0FFFFFFF8h
00411A41 mov dword ptr [ebp-30h],0

现在的问题是:为什么word转换成__int64就会正确,而DWORD转换成__int64就有问题呢?
xiaohuh421 2012-08-04
  • 打赏
  • 举报
回复
编程是要看书和做实验的.
楼主最好单步"汇编"代码看看,应该就能明白为何出现自己的实验结果了.
iamnobody 2012-08-03
  • 打赏
  • 举报
回复
编程不是做实验,看书吧.
sunlikerain 2012-08-03
  • 打赏
  • 举报
回复
你说的不对,请做过实验再来
图灵狗 2012-08-03
  • 打赏
  • 举报
回复
结果全部都是-8,没有问题的,可能是你打印的时候类型不匹配:

int a = (WORD)2 - (WORD)10;
__int64 c = (WORD)2 - (WORD)10;
int d = (DWORD)2 - (DWORD)10;
__int64 b = (DWORD)2 - (DWORD)10;

printf("%d, %lld, %lld, %d\n", a, b, c, d);

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧