首先要区分有符号数和无符号数. c语言中区分有符号数和无符号数,java中只有有符号数.不存在无符号的情况.
一: 无符号数的二进制就是无符号数编码.只有这一种编码
如果是n位的无符号数. 二进制转十进制无符号数的方式是把每位的二进制相加(深入理解计算机系统44页)
二: 有符号数的编码通常有补码,原码,反码.
①: 补码最常见. Java中只有补码表示. 如果是n位的补码.最左位的权是 负的2的(n-1)次方. 深入理解计算机45页
②: 反码. 最左边位的权是 负的2的(n-1)次方再减1. 所以表示的数字少了一个
③: 原码. 最左边位只表示符号位,不参与计算.这点跟补码的区别注意区分.
总结: 反码,原码中的0都有两种表示. 如反码中的11111111就是0,在补码中表示-1. 原码中的10000000也表示0. 所以他们都少表示一个数.
有符号数在几乎所有现代机器上都是用补码表示.浮点数中有使用原码编码.
原码,反码,补码在c语言java中的表示的区别.
原文:https://www.cnblogs.com/wangzhaosheng/p/13169745.html