1
skydiver 2014-08-25 22:50:11 +08:00 via iPad
反汇编一下看看
|
2
nopy 2014-08-25 22:50:59 +08:00
|
3
YouXia 2014-08-26 02:09:05 +08:00
内存里面补码表示,负数除符号位外,取反加1,而减1,其实是加负1(也是补码表示)。
|
4
zwzmzd 2014-08-26 09:39:47 +08:00
http://blog.csdn.net/seizef/article/details/7605010
和编译器语法分析的设计有关 |
5
glogo 2014-08-26 09:42:01 +08:00
LZ 可以看看《深入理解计算机操作系统》讲信息在计算机中表示的那一节,有讲到这个问题的~
|
6
stackpop 2014-08-26 09:51:17 +08:00
4楼是正解.
用clang编译, 楼主的两个if都是false 第二个if, 有些编译器可能会认为和 if( -2147483647 < -1 )是等价的, 有些编译器可能会先做减法再做大小比较.亦或者和<所代表的位运算有关. |
7
Monad 2014-08-26 09:56:59 +08:00
我想知道楼主用的啥编译器试出来的
|
9
winterma OP @stackpop -2147483647 - 1算出来的结果应该是100.....00(31个0), 也就是负零,不知道负零在计算机里面有什么含义吗?
|
10
zwzmzd 2014-08-26 19:14:49 +08:00
@winterma 补码表示中零只有一种表示,那就是0x00000000(32位情况下),没有什么正零负零的区别。
LZ可以用下面代码显示INT_MIN的十六进制表示: printf("0x%08x\n", INT_MIN); 还有就是要注意的是,补码可表示的数字范围,负数会比正数多一个(正是因为零的存在) 0x00000000 对应 0 0x00000001~0x7fffffff 对应正数 1~2147483647 0x80000000~0xffffffff 对应负数 -2147483648~-1(注意对应顺序,是反着的) 按照上面的表将这些数字画到一个环上去,这个数环蕴含了正无穷和负无穷相接的思想 你直接写-2147483648,gcc将其认为是一个表达式,即一个负号(-)和一个立即数(2147483648),而2147483648不是32位计算机中可以直接表示的数字(数环里没有这个数字),所以gcc在编译的时候会有warning出现,并且对于这个情况会采用一些默认处理,造成了意料之外的结果。 |