免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5143 | 回复: 8
打印 上一主题 下一主题

问一个十六进制常量的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-09-16 00:29 |只看该作者 |倒序浏览
C++ primer上说十六进制字面值的类型是int,那么为什么我写cout << (0xFFFFFFFF>0);运行的结果是1呢?如果 0xFFFFFFFF的类型是int的话,它的值应该是-1才对啊 我用的devcpp

论坛徽章:
0
2 [报告]
发表于 2006-09-20 12:43 |只看该作者
C++ Primer 上的说法不正确。

整数字面量的类型与进制表示(十进制、八进制、十六进制)以及其值所在的范围有关。对于十六进制的整型字面量来说,如果它的值在 int 范围内能够表示,则类型为 int; 否则,如果在 unsigned int 的范围内能够表示,则类型为 unsigned int;其余依次是 long int、unsigned long int、long long int、unsigned long long int。

0xFFFFFFFF 是一个十六进制表示的数。需要注意的是:0xFFFFFFFF 表示这个数的值的大小,而不是这个数在计算机内部的表示。在32位机上,一般这个值超出了 int 的表示范围,但是在 unsigned int 的范围之内,所以这个数的类型是 unsigned int。与 0 进行比较的话总是比 0 大,即 (0xFFFFFFFF>0) 的结果为 1。但是无论如何,比较的结果不会为 -1,因为比较的结果只能是 true(1)和 false(0)二者之一。

论坛徽章:
0
3 [报告]
发表于 2006-09-21 19:22 |只看该作者

回复 2楼 whyglinux 的帖子

如果0xFFFFFFFF是int类型的话,它的值就是-1,怎么会超出int的范围呢?如果我写int a =0xFFFFFFFF,打印出a的值是-1,可见0xFFFFFFFF确实表示这个数在计算机内部的表示啊

论坛徽章:
0
4 [报告]
发表于 2006-09-21 19:33 |只看该作者
可能你的平台有问题。

另,建议编译成汇编代码,这样容易发现问题,而不是空谈。

论坛徽章:
0
5 [报告]
发表于 2006-09-21 20:04 |只看该作者
理解错了
原帖由 kaddmus 于 2006-9-21 19:22 发表
如果0xFFFFFFFF是int类型的话,它的值就是-1,怎么会超出int的范围呢?如果我写int a =0xFFFFFFFF,打印出a的值是-1,可见0xFFFFFFFF确实表示这个数在计算机内部的表示啊

论坛徽章:
0
6 [报告]
发表于 2006-09-21 21:07 |只看该作者
原帖由 8missile8 于 2006-9-21 20:04 发表
理解错了


请问应该怎么理解?

论坛徽章:
0
7 [报告]
发表于 2006-09-21 23:23 |只看该作者
原帖由 kaddmus 于 2006-9-21 19:22 发表
如果0xFFFFFFFF是int类型的话,它的值就是-1,怎么会超出int的范围呢?如果我写int a =0xFFFFFFFF,打印出a的值是-1,可见0xFFFFFFFF确实表示这个数在计算机内部的表示啊


的确,如果一个数在计算机中的内部表示是 0xFFFFFFFF,那么当它被解释为 int 类型、并且 int 类型的负数用补码来表示的时候,这个 int 数据的值是 -1。当解释为 unsigned int 类型时,是一个正数,数值大小为 0xFFFFFFFF,即十进制的 4294967295。

可见,十六进制数既可以用来描述一个数的内部表示,也可以表示一个数的大小。你在这两者上混淆了。

再强调一下:在程序中出现的整型字面量表示的是一个数的大小,是一个数值,而不是数在计算机中的内部表示。整型字面量都是非负数(除非你在数的前面人为加上负号“-”)。

在一般的 32 位系统上,数 0xFFFFFFFF (或 4294967295)已经超出了 int 类型的表示范围。因此,根据标准的规定,用它来初始化一个 int 变量的结果是未定义的。虽然很多系统上可以使这个变量的值为 -1,但这样的结果是得不到保证的。对于象 int 这样的有符号类型变量的赋值或者初始化,一定要注意给定的值要在变量的类型表示范围之内。

论坛徽章:
0
8 [报告]
发表于 2006-09-21 23:48 |只看该作者
看山还是山,看水还是水

数还是数,类型只是表面现象,在乎你怎么用!

论坛徽章:
0
9 [报告]
发表于 2006-09-22 00:10 |只看该作者
嗯  学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP