首页 > 代码库 > 负号干了啥?

负号干了啥?

1. 1和-1在内存中是如何表示的?

2. 给一个数加上负号在内存中会如何改变?

3.一个练习引发的思考。


先引入一个小工具,作用是将一个char转成二进制表示。

static void n2(unsigned char c) {
    int i;
    for (i = 0; i < 8; i++) {
        if (128 & c)
            putchar(‘1‘);
        else
            putchar(‘0‘);
        c <<= 1;
    }   
    printf("\n");
}

用法:

n2(1);
n2(-1);

输出:

 1:00000001
-1:11111111

再打印几个数。

 3:00000011
-3:11111101
 4:00000100
-4:11111100

有新发现

1的二进制表示是00000001,取反:11111110,加1:11111111,等于:-1:11111111

3的二进制表示是00000011,取反:11111100,加1:11111101,等于:-3:11111101

4的二进制表示是00000100,取反:11111011,加1:11111100,等于:-4:11111100

大胆的得出结论,负号的作用是对内存的二进制位取反加一


为什么有上面的思考?

是因为解一个求signed char 最小值的问题。

本人的写法是 (char )(((unsigned char)~0 >> 1) + 1)

书上的答案是-(char)((unsigned char)~0 >> 1)

一直想不通答案为什么那么写。最后发现是答案错了

那本书名是<c程序设计语言(第2版)习题解答>

负号干了啥?