Linux下C的补码反码以及无符号

中午把之前《深入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);

}

此条目发表在未分类分类目录。将固定链接加入收藏夹。

发表评论

邮箱地址不会被公开。 必填项已用*标注