-16 | 12 等于多少

原创
2011/01/17 18:03
阅读数 263

今天同事问到一个问题 -16 | 12 等于多少?

从教材中知道,二进制数的第一位是符号位,正数为0,负数为1,再根据取反的定义可得到如下算式(假设整形是占四位):

(-64)10  (12)10 = (10000000 00000000 00000000 01000000)2  | (00000000 00000000 00000000 00001100)2

                              = (10000000 00000000 00000000 01001100)2 = ( -76)10

可以我们不论是通过计算器还是C程序计算出来的结果都是:(52)10

百思不得其解,网上一翻风云之后了解到,原来 负数是按补码的形式存放在内存中的。那么,

(-64)10  (12)10 = (11111111 11111111 11111111 11000000)2  | (00000000 00000000 00000000 00001100)2

                              = (11111111 11111111 11111111 11001100)2 

                              => -((00000000 00000000 00000000 001100112  +(00000000 00000000 00000000 00000001)2// 补码求值,取反加1

                               =-(00000000 00000000 00000000 00110100)=( -52)10

 

PS:教材上类似于 “二进制数的第一位是符号位,正数为0,负数为1” 的讲法容易让学生误解。更好的讲法应该是 负数是以负数的绝对值的补码的形式存放在内存中的

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
0 评论
1 收藏
0
分享
返回顶部
顶部