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

1 篇文章 0 订阅

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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值