码迷,mamicode.com
首页 > 其他好文 > 详细

负号干了啥?

时间:2014-09-27 15:21:51      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:ar   strong   for   sp   问题   on   c   amp   r   

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版)习题解答>

负号干了啥?

标签:ar   strong   for   sp   问题   on   c   amp   r   

原文地址:http://my.oschina.net/guonaihong/blog/322589

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!