2019独角兽企业重金招聘Python工程师标准>>>
今天同事问到一个问题 -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 00110011)2 +(00000000 00000000 00000000 00000001)2) // 补码求值,取反加1
=-(00000000 00000000 00000000 00110100)2 =( -52)10
PS:教材上类似于 “二进制数的第一位是符号位,正数为0,负数为1” 的讲法容易让学生误解。更好的讲法应该是 负数是以负数的绝对值的补码的形式存放在内存中的。