| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1348 人关注过本帖
标题:求高手指导:关于WIN7下VC 6.0 短整型长度的问题
只看楼主 加入收藏
killah
Rank: 2
等 级:论坛游民
帖 子:55
专家分:11
注 册:2013-2-4
收藏
得分:0 
回复 9楼 zklhp
我用sizeof求a和b的长度,都是2字节=16位,压出来32位的话是不是应该显示4字节啊?
2013-02-04 22:29
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:0 
程序代码:
0x004013b0 <main+0>:   push   ebp
0x004013b1 <main+1>:   mov    ebp,esp
0x004013b3 <main+3>:   push   ebx
0x004013b4 <main+4>:   and    esp,0xfffffff0
0x004013b7 <main+7>:   sub    esp,0x30
0x004013ba <main+10>:  call   0x401a20 <__main>
0x004013bf <main+15>:  mov    WORD PTR [esp+0x2e],0xffff
0x004013c6 <main+22>:  mov    WORD PTR [esp+0x2c],0xfffe
0x004013cd <main+29>:  movzx  ebx,WORD PTR [esp+0x2e]
0x004013d2 <main+34>:  movzx  ecx,WORD PTR [esp+0x2e]
0x004013d7 <main+39>:  movzx  edx,WORD PTR [esp+0x2e]
0x004013dc <main+44>:  movzx  eax,WORD PTR [esp+0x2e]
0x004013e1 <main+49>:  mov    DWORD PTR [esp+0x10],ebx
0x004013e5 <main+53>:  mov    DWORD PTR [esp+0xc],ecx
0x004013e9 <main+57>:  mov    DWORD PTR [esp+0x8],edx
0x004013ed <main+61>:  mov    DWORD PTR [esp+0x4],eax
0x004013f1 <main+65>:  mov    DWORD PTR [esp],0x403064
0x004013f8 <main+72>:  call   0x401c90 <printf>
0x004013fd <main+77>:  movsx  ebx,WORD PTR [esp+0x2c]
0x00401402 <main+82>:  movsx  ecx,WORD PTR [esp+0x2c]
0x00401407 <main+87>:  movsx  edx,WORD PTR [esp+0x2c]
0x0040140c <main+92>:  movsx  eax,WORD PTR [esp+0x2c]
0x00401411 <main+97>:  mov    DWORD PTR [esp+0x10],ebx
0x00401415 <main+101>: mov    DWORD PTR [esp+0xc],ecx
0x00401419 <main+105>: mov    DWORD PTR [esp+0x8],edx
0x0040141d <main+109>: mov    DWORD PTR [esp+0x4],eax
0x00401421 <main+113>: mov    DWORD PTR [esp],0x403074
0x00401428 <main+120>: call   0x401c90 <printf>
0x0040142d <main+125>: mov    DWORD PTR [esp+0x28],0x2
0x00401435 <main+133>: mov    DWORD PTR [esp+0x24],0x2
0x0040143d <main+141>: mov    eax,DWORD PTR [esp+0x24]
0x00401441 <main+145>: mov    DWORD PTR [esp+0x8],eax
0x00401445 <main+149>: mov    eax,DWORD PTR [esp+0x28]
0x00401449 <main+153>: mov    DWORD PTR [esp+0x4],eax
0x0040144d <main+157>: mov    DWORD PTR [esp],0x403083
0x00401454 <main+164>: call   0x401c90 <printf>
0x00401459 <main+169>: mov    eax,0x0
0x0040145e <main+174>: mov    ebx,DWORD PTR [ebp-0x4]
0x00401461 <main+177>: leave 
0x00401462 <main+178>: ret  


可惜如果不懂汇编看不懂。。
2013-02-04 22:36
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
以下是引用killah在2013-2-4 20:29:48的发言:

是整型,十六进制和无符号整型

3楼已经补充回了你。没错,b是short int,但"%d"、"%x"、"%u"这样的格式符,是让printf()把数据解释为int或unsigned int的,它不用管实参的类型,关键是格式符要求它把数据解释成什么,你传个double或char*数据进去,它也一样当int来解释,那就是32位的数据结果。

其实,要理解printf()工作原理的例子,最佳莫如下面的代码:
int x = 65;
printf("%d,%c", x, x);
注意:同样的int,同样的x值,不同的格式符,得到不同的结果!你所问的也一样。如果你愿意,上面代码加上%f看看整数如何被弄成浮点数。

明白了这个道理,就知道为什么printf("%d", "hello")这样明显有问题的代码编译时编译器也不会给出错误和警告了,也会明白scanf("%d", x)这样没有取地址符的语句也能通过的原因了。再深入一点,自己写个简易的scanf()/printf()函数就知道是怎么回事,要写出全部功能不容易,但要写出工作原理的示范,并不难。

[ 本帖最后由 TonyDeng 于 2013-2-5 04:13 编辑 ]

授人以渔,不授人以鱼。
2013-02-05 04:08
killah
Rank: 2
等 级:论坛游民
帖 子:55
专家分:11
注 册:2013-2-4
收藏
得分:0 
回复 12楼 zklhp
能看的懂个大概,汇编里面数据位数什么的都是对的,处理a和b的时候除了符号扩展方法不一样其他都是一样的,可能是printf函数的问题吧。。。
2013-02-05 09:42
killah
Rank: 2
等 级:论坛游民
帖 子:55
专家分:11
注 册:2013-2-4
收藏
得分:0 
回复 13楼 TonyDeng
%d我明白的,printf出来都是32位的,但是a和b的长度都是2字节,用%o,%x,%u处理出来的结果长度却不一样,a对应的%o,%x,%u输出是2字节,而b对应的输出都是4字节。
输入的都是2字节的数,为什么%o,%x,%u会区别对待呢?
2013-02-05 09:48
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
a的内部存储全部是二进制1,被解释成-1,这是一个特殊数字,可以用最简单的形式输出,不管被解释成多少位的,都可以用11111111来表示。而-2是11111110,扩展到16位,在前面加8个1,扩展到32位,在前面加24个1,结果就不一样。反过来你看11111111,不管怎么扩展,全部都是1,都可以简单地用8个1来替代。

授人以渔,不授人以鱼。
2013-02-05 12:52
killah
Rank: 2
等 级:论坛游民
帖 子:55
专家分:11
注 册:2013-2-4
收藏
得分:0 
回复 16楼 TonyDeng
我试了下把a的值也改成-2,同样a的输出仍是16位,b的输出是32位,所以可能这个和a的数值没有太大关系,不知道哪里出了问题。。。
2013-02-05 15:29
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
声明了unsigned,你还改得出负数?编译器会把你输入的-2编译成高位为1的数据吗?看得出你一直在抗拒这种解释,那就到此为止吧。

[ 本帖最后由 TonyDeng 于 2013-2-5 15:32 编辑 ]

授人以渔,不授人以鱼。
2013-02-05 15:31
killah
Rank: 2
等 级:论坛游民
帖 子:55
专家分:11
注 册:2013-2-4
收藏
得分:0 
回复 18楼 TonyDeng
我把-2赋给a时得出的结果是-2,177776,fffe,65534
PS.我试过把b改成65535,同样a的输出仍是16位,b的输出是32位
2013-02-15 11:58
wldnscjf
Rank: 2
等 级:论坛游民
帖 子:20
专家分:14
注 册:2013-1-27
收藏
得分:0 
不知道我这样理解对不对?
winxp 32位的 和 win7 64位的  位数不一样?

比如:winxp long int 是输出4字节的
       win7 long int 是输出8字节的???
不知道对不对


[ 本帖最后由 wldnscjf 于 2013-2-15 18:50 编辑 ]
2013-02-15 18:48
快速回复:求高手指导:关于WIN7下VC 6.0 短整型长度的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019185 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved