有关uint和int比大小的问题

winmenaruto 2011-07-01 10:22:55
{unsigned int x=-1;
int y;
y = ~0;
if(x == y)
printf("same");
else
printf("not same");
}

a) same, MAXINT, -1
b) not same, MAXINT, -MAXINT
c) same , MAXUNIT, -1
d) same, MAXUNIT, MAXUNIT
e) not same, MAXINT, MAXUNIT

Ans. (a)

答案是a,但是我觉得是D,大家怎么看?
...全文
933 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 winmenaruto 的回复:]

引用 7 楼 zhao4zhong1 的回复:

VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。

理论哥又见到你啦~~你好
[/Quote]
其实我曾经一度怀疑他是某公司最新研制的 AI~~

长年累月地在论坛里做这种 Ctrl+C Ctrl+V 的事情岂是我们常人可以忍受的~~
winmenaruto 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zhao4zhong1 的回复:]

VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
[/Quote]
理论哥又见到你啦~~你好
赵4老师 2011-07-01
  • 打赏
  • 举报
回复
VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
FrankHB1989 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 winmenaruto 的回复:]

引用 4 楼 pathuang68 的回复:

A是对的。
在32-bit的系统上:
unsigned int x=-1; -> x = 11111111 11111111 11111111 11111111b = MAXINT (因为unsigned int没有负数)

int y = ~0; -> y = ~(00000000 00000000 00000000 000000……
[/Quote]
把题干给完整再说吧。
winmenaruto 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 pathuang68 的回复:]

A是对的。
在32-bit的系统上:
unsigned int x=-1; -> x = 11111111 11111111 11111111 11111111b = MAXINT (因为unsigned int没有负数)

int y = ~0; -> y = ~(00000000 00000000 00000000 00000000b) = 11111111 11111111 1……
[/Quote]
请看一下这个:http://ted.is-programmer.com/posts/4454.html
我感觉,uint和int一起,肯定int
变成uint,结果里面有MAXINT这好像不对吧
pathuang68 2011-07-01
  • 打赏
  • 举报
回复
A是对的。
在32-bit的系统上:
unsigned int x=-1; -> x = 11111111 11111111 11111111 11111111b = MAXINT (因为unsigned int没有负数)

int y = ~0; -> y = ~(00000000 00000000 00000000 00000000b) = 11111111 11111111 11111111 11111111b = -1 (因为int有负数,第一位为符号位)

可以看到他们的二进制表示是相同的

FrankHB1989 2011-07-01
  • 打赏
  • 举报
回复
无解。ISO C/C++整数实现是可以用1's compliment的,尽管常见的平台上你都可以指望机器数用补码(并且<stdint.h>的一些定义也用了2's compliment)。
这里~0用ISO C的说法是一个trap representation,这里就是undefined behavior……
参考:http://bytes.com/topic/c/answers/213015-trap-representation
ISO C++在这里就比较糊,不过应该认为是同一情况,虽然没说。。。
不过看来一般都默认是补码了= =那就same。
至于后面的值等于多少,看你怎么打印的了。%d和%u在同一个平台上就可以表现出不同答案。要论实际类型,那么就是A。
winmenaruto 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]

相等,你后面打印代码在哪,y=-1
[/Quote]
如果32位cpu ,y=0xffff,ffff,ffff,ffff,但是和uint比大小,int转为uint,所以y转为y=0x7fff,ffff,ffff,ffff,我是这样理解的
bdmh 2011-07-01
  • 打赏
  • 举报
回复
相等,你后面打印代码在哪,y=-1
pathuang68 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 pathuang68 的回复:]

引用 5 楼 winmenaruto 的回复:

引用 4 楼 pathuang68 的回复:

A是对的。
在32-bit的系统上:
unsigned int x=-1; -> x = 11111111 11111111 11111111 11111111b = MAXINT (因为unsigned int没有负数)

int y = ~0; -> y = ~(000000……
[/Quote]
也就是说同样的11111111 11111111 11111111 11111111b这个数值,用unsigned int的角度去看它是MAXINT,用int的角度去看它是-1,但是在他们比较的时候,会临时将int提升为unsigned int,因此他们就相等了,所以就会输出same。

就像同一块内存,你用不同的数据类型去看它,它就是不同的东西。最典型的例子就是用基类类型的指针,指向其派生类对象。
pathuang68 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 winmenaruto 的回复:]

引用 4 楼 pathuang68 的回复:

A是对的。
在32-bit的系统上:
unsigned int x=-1; -> x = 11111111 11111111 11111111 11111111b = MAXINT (因为unsigned int没有负数)

int y = ~0; -> y = ~(00000000 00000000 00000000 000000……
[/Quote]
只是在比较的时候会将int临时提升为unsigned int,否则怎么会相等呢,对吧?但是实际上其数据类型是不会改变的。
5t4rk 2011-07-01
  • 打赏
  • 举报
回复
laozhao
我再次顶你
5t4rk 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hpsmouse 的回复:]

引用 8 楼 winmenaruto 的回复:

引用 7 楼 zhao4zhong1 的回复:

VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。

理论……
[/Quote]
--呵呵
这话说得
AI估计绝对不是的
我看这位是在授人以渔
的世外高人。他的那简短几句
确实是学习编程的金玉良言
++++++laozhao
赵4老师 2011-07-01
  • 打赏
  • 举报
回复
1:    #include <stdio.h>
2: unsigned int x=-1;
3: int y;
4: void main() {
//00401010 55 push ebp
//00401011 8B EC mov ebp,esp
//00401013 83 EC 40 sub esp,40h
//00401016 53 push ebx
//00401017 56 push esi
//00401018 57 push edi
5: y = ~0;
//00401019 C7 05 34 45 41 00 FF mov dword ptr [_y (00414534)],0FFFFFFFFh
6: if (x==y)
//00401023 A1 10 44 41 00 mov eax,[_x (00414410)]
//00401028 3B 05 34 45 41 00 cmp eax,dword ptr [_y (00414534)]
//0040102E 75 10 jne main+30h (00401040)
7: printf("same");
//00401030 68 28 30 41 00 push offset string "same" (00413028)
//00401035 FF 15 A0 50 41 00 call dword ptr [__imp__printf (004150a0)]
//0040103B 83 C4 04 add esp,4
8: else
//0040103E EB 0E jmp main+3Eh (0040104e)
9: printf("not same");
//00401040 68 1C 30 41 00 push offset string "not same" (0041301c)
//00401045 FF 15 A0 50 41 00 call dword ptr [__imp__printf (004150a0)]
//0040104B 83 C4 04 add esp,4
10: }
//0040104E 5F pop edi
//0040104F 5E pop esi
//00401050 5B pop ebx
//00401051 8B E5 mov esp,ebp
//00401053 5D pop ebp
//00401054 C3 ret


;1:    #include <stdio.h>
;2: unsigned int x=-1;
;3: int y;
;4: void main() {
00401010 55 push ebp
00401011 8B EC mov ebp,esp
00401013 83 EC 40 sub esp,40h
00401016 53 push ebx
00401017 56 push esi
00401018 57 push edi
;5: y = ~0;
00401019 C7 05 34 45 41 00 FF mov dword ptr [_y (00414534)],0FFFFFFFFh
;6: if (x==y)
00401023 A1 10 44 41 00 mov eax,[_x (00414410)]
00401028 3B 05 34 45 41 00 cmp eax,dword ptr [_y (00414534)]
0040102E 75 10 jne main+30h (00401040)
;7: printf("same");
00401030 68 28 30 41 00 push offset string "same" (00413028)
00401035 FF 15 A0 50 41 00 call dword ptr [__imp__printf (004150a0)]
0040103B 83 C4 04 add esp,4
;8: else
0040103E EB 0E jmp main+3Eh (0040104e)
;9: printf("not same");
00401040 68 1C 30 41 00 push offset string "not same" (0041301c)
00401045 FF 15 A0 50 41 00 call dword ptr [__imp__printf (004150a0)]
0040104B 83 C4 04 add esp,4
;10: }
0040104E 5F pop edi
0040104F 5E pop esi
00401050 5B pop ebx
00401051 8B E5 mov esp,ebp
00401053 5D pop ebp
00401054 C3 ret

赵4老师 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 hpsmouse 的回复:]
引用 8 楼 winmenaruto 的回复:

引用 7 楼 zhao4zhong1 的回复:

VC调试时按Alt+8,TC或BC用TD调试,打开汇编窗口看每句C对应的汇编并单步执行一遍不就啥都明白了吗。
(Linux或Unix下应该也可以在用GDB调试时,看每句C对应的汇编并单步执行。)

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。

理论哥……
[/Quote]
“眼不见为净”不就行了!
不过我这几句大实话经常还能混(挣)分。
可惜的是99%看过这句话的人从来都没在调试时按过Alt+8键。
所以说:这个世界上最大的差别和最远的距离都存在于“我说”和“你做”之间。

64,643

社区成员

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

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