为什么65535的二进制为111.1111(16个1),111.1111(16个1)是-1的二进制?
- 提问者网友:雾里闻花香
- 2021-03-19 10:32
65535是2的16次方再减1,为什么就是16个一啊
- 五星知识达人网友:夜风逐马
- 2021-03-19 11:12
2^16=65536,2^16-1=65535这没有错啊!111.1111(16个1)是-1的二进制也没错,但这是在int型为2字节的时候.当int型为2字节时,能表示的有符号数的范围是-32768~32767,表示无符号数时范围是0~65535.现在的int型已大都为4字节了,你困惑的这个问题已转移到更大的数上去了.其实计算机里没有什么正数、负数,都是些0、1符号,代表什么数看编程者怎么对待了.就说这111.1111(16个1),在16位整型平台下,编程者如果认为是无符号数,那就是65535,而如果编程者认为是有符号的,那就是-1了.所以不要困惑.
如果你是学C的,用下面的语句来理解我上面的回答——
#include stdio.h
void main(void){
\x09int a=0xFFFF;//这就是16个1
\x09printf(%d %u\n,a,a);
}
再问: 就是为什么2^16-1=65535,65535的二进制就是111....1111(16个1),-1的二进制是111....1111(16个1),算法规则是什么啊,谢谢
再答: 用2除,反向取余数,就把十进制变成二进制了—— 65535÷2 = 32767 余 1 32767÷2 = 16383 余 1 16383÷2 = 4095 余 1 4095÷2 = 2047 余 1 2047÷2 = 1023 余 1 1023÷2 = 511 余 1 511÷2 = 255 余 1 255÷2 = 127 余 1 127÷2 = 63 余 1 63÷2 = 31 余 1 31÷2 = 15 余 1 15÷2 = 7 余 1 7÷2 = 3 余 1 3÷2 = 1 余 1 1÷2 = 0 余 1 反向取余数:11111111 11111111。 至于-1的也是11111111 11111111的“来历”: 16位表示-1的原码是10000000 00000001,那个最高位上的1是表示负数的称号。计算机中都是用补码表示的,求补码的办法之一是:先求其反码,再加1;反码求法是除符号位外各位取反:11111111 11111110,求补码再加1,即是11111111 11111111。这就是-1在计算机中的16位二进制表示。