首页 > 代码库 > 负号干了啥?
负号干了啥?
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版)习题解答>
负号干了啥?
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。