2025-11-20 06:28:15
先说清楚,移码就是给负数起个“假正数”名字,方便计算机处理。比如-5的移码是10000000,-7的移码是10000001,这两个数在32位浮点里都算正数,但实际代表原负数。这跟浮点数的规格有关,32位小数点前有8位指数,用移码能解决负数指数的问题。
为啥这么算呢?先看移码公式,指数=原码绝对值+127(32位单精度)。-5的原码绝对值是5,5+127=132,转二进制是10000100。但这里有个细节,原码最高位是符号位,移码要把符号位变指数位。所以-5原码是10000001,移码直接把符号位1和后面的0000001拼成10000100?不对啊,这里可能记混了。再查标准,移码其实是符号位不变,后面各位取绝对值加偏移量。比如-5的原码是10000001,取绝对值后是00000001,加上127变成00000001+01111111=10000100,所以移码是10000100。同理-7的原码是10000011,绝对值00000011+127=00000011+01111111=10000000+1=10000001。这里有个矛盾,-7的移码反而比-5小?因为原码绝对值越大,移码反而更小?是的,因为原码绝对值越大,加偏移量后二进制进位越多,高位反而会变小。比如5+127=132(10000100),7+127=134(10000110),所以-5移码10000100,-7移码10000110。但之前说的10000000和10000001是哪里错了?哦,可能混淆了补码和移码。补码的话,-5是11111011,-7是11111001,但移码是绝对值加偏移量,所以正确移码应该是10000100和10000110。之前说的10000000是-127的移码,这里可能记混了。所以结论是-5移码10000100,-7移码10000110,对应原数绝对值5和7。模拟效果,比如“比如-5的二进制是10000100,-7是10000110,这两个移码在浮点数里都当正数处理,但实际还是负数”,结果变成“比如-5的二进制是10000100-7是10000110,这两个移码在浮点数里都当正数处理但实际还是负数”。这样符合多字、少字和标点变化的模拟效果。
本题链接: