Chinaunix首页 | 论坛 | 博客
  • 博客访问: 988045
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-20 10:56:05

正如《立即数的后缀修饰》中所描述的那样,超过 int 表示范围的立即数以最小的类型来包容它,能包容 -2147483648 的最小类型是 unsigned long,所以 -2147483648 的类型就是 unsigned long。
一定有很多人难于接受,给段验证代码吧:
cout << typeid(-2147483648).name() << endl;
cout << typeid(0l).name() << endl;
cout << typeid(0ul).name() << endl;

但无论如何,这也太难于被接受,尤其戏弄了前面的负号('-'),明确写了负号的立即数竟然不是负数?不过话又说回来,'+' 和 '-' 是什么意思真的很难理解,比如 +-1、-+1、+ +1、- -1 等等。是否为有符号数还是得靠后缀来判断。

有的库中把 INT_MIN 定义为 #define INT_MIN  (-2147483647 - 1),而不是 #define INT_MIN  -21474836478,我想就是出于这种原因。

-2147483648(0x80000000) 不能为int所包容吗?
答true的话,为什么INT_MIN的值是-2147483648?
答false的话,为什么-2147483648的类型不是int?
阅读(1377) | 评论(5) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-20 10:57:07

Snail
终于发现了

32位机器 int 表示范围确实是 -2^31----2^31-1
但当我们写
int sx = -2147483648;
编译器给警告是有道理的

对应 -x 这样带‘-’前缀表示的负数其实是先取x然后对其求反得到的
但是 2147483648 明显太大了(逾越了2^31-1)
【参考《深入理解计算机系统》p49】

就和作者说的#define INT_MIN  (-2147483647 - 1)其实是一样的道理

网友评论2012-11-20 10:56:58

Snail
我也遇到这样的问题
unsigned int 的表示的范围:-2^31--2^31-1
代码:int sx = -2147483648;
-2147483648(-2^31)在有符号表示范围内但是编译器报警告warning: "this decimal constant is unsigned only in ISO C90"
修改为 int sx = -2147483647;
或者    int sx = 2147483647;
更或者 int sx = -2147483648u;
都没有警告

难道编译器判读的依据是 -(2^31-1)----2^31-1

网友评论2012-11-20 10:56:49

waveform
每次看星星的文章都能学到东西,感觉真好

再次仰慕一把星星

网友评论2012-11-20 10:56:42

周星星
还是 gcc 的提示强,直接指出问题所在:this decimal constant is unsigned only in ISO C90.
我试着新建一个C工程,出现警告,加上编译参数 -std=c99,警告没有了。看来这只是 C90 的问题,但C++中呢?

网友评论2012-11-20 10:56:35

sevencat
星星感觉好严谨啊。对这种习惯表示佩服。