中午把之前《深入OOXX》继续翻了几页,觉得这样东看看西看看不是个办法,先静下心来弄最喜欢的一个吧。
书上有一页谈到, “我们必须把Tmin_32写为-2147483647-1,而不是-2147483648,编译器在处理一个形为-X的表达式的方法是先读表达式X,然后对它取反,但是2147483648太大了,不能表示为一个32位的,二进制补码数。”
看到这里我琢磨了一会,因为 -2147483648 [这里的换算先不仔细说明,下面有一个程序跑出的结果与这里相同]
相当于 0x80 00 00 00 而 -2147483647 为 0x 80 00 00 01
继续有 2147483647 为 0x 7F FF FF FF
取反有 0x 80 00 00 00
这里是因该加1吧?
如果是的话书上的话可能有误区。
“编译器在处理一个形为-X的表达式的方法是先读表达式X,然后对它取反,[然后加1?]
”
或者,作者言下的取反有+1运算
顺便测试了下-max-1 溢出的情况 -2147483648 为 0x80 00 00 00
-1后得 0x7F FF FF FF
猜想是 对1(0x00 00 00 01)取反 0xFF FF FF FE
加到 0x80 00 00 00
得 0x 1
7F FF FF FE
测试时的结果为
0x 7F FF FF FF 同样也存在加1的问题。
顺便说一点,测试时我直接试了
-2147483648 显示正确,编译器聪明了 ^^?
#include <stdio.h>
#include <stdlib.h>
int outit(unsigned char * ptr,int n)
{
int i;
for(i=0;i<n;i++)
{
printf("%.2X ",*(ptr+i));
}
printf("\n");
return 0;
}
int main()
{
int test;
int op=0;
do
{
printf(" Input :\n");
scanf("%d",&test);
scanf("%d",&op);
if (op) test–;
outit((unsigned char *)&test,sizeof(test));
printf("%uU and %d\n",test,test);
} while (1);
}