背景
这几天确实太忙了,之前是日更,说上班后来个隔日更,还是坚持不了。完成Q1季度的考评后发现群里有人问了一个问题,非常的有意思。当时我也是非常的懵逼,然后想自己尝试的去解决一下。
问题是:0xee 0xb9
转short
得到 -4423
为什么?对啊,为什么?我TM也想知道。
其实到这里,我先总结一下:
- 计算机为什么能计算你这么快,原因是它只会处理0与1,二级制;
- 其实到硬件上面表现的就是电流信号、脉冲信号;
- 计算机虽然支持减法,乘法,除法,实际上底层只会一种算法,那就是加法;
这也就是当时大学老师跟我们说的,别以为计算机很厉害,其实它很傻逼。每一步操作都需要设定好逻辑与程序。
恶补基础知识点
我们还是梳理一下基础知识吧~
1、
byte
:有符号(意思是有正和负),在网络传输中都是会用到byte的,它占1个字节,共8位,比如说11111111就可以用1个byte表示,转化为10进制:- (2的6次+2的5次+2的4次+2的3次+2的2次+2的1次+2的0次) = -127。其中前7位表示数字,最高位表示符号,0为正,1为负。范围是 (-2的7次 ~ 2的7次 - 1),那为什么前面最小是-127,范围最小又是-128呢?因为规定-0(10000000)为-128。2、
short
:有符号,占2个字节,共16位。同byte一样,它的取值范围就是 (-2的15次 ~ 2的15次 - 1)。3、
int
:有符号,占4个字节,共32位。它的取值范围就是(-2的31次 ~ 2的31次)。4、
long
:有符号,占8个字节,共64位,它的取值范围就是(-2的63次 ~ 2的63次)。5、
^
:表示异或位运算,两者相同则为0,两者不同则为1。比如说15^2,15用二进制表示就是1111,2用2进制表示就是0010,两者进行异或运算,结果就是1101,转换为十进制就是13。6、
|
:表示或运算,两者只有有一个为1就为1, 比如说13|2,13用二进制表示就是1101,2用二进制表示就是0010,两者进行或运算,那么结果就是1111,转换为十进制就是15。7、
&
:表示与运算,两者都为1就为1,其余都为0,比如说15&2, 13用二进制表示就是1111,2用二进制表示就是0010, 两者进行与运算,那么结果就是0010,转换为十进制就是2。8、
~
:取反,就是本来是0变成1,本来是1变成0。
计算机中存储是用补码!!,同时注意一下计算省略了高位不变部分
我举个例子,比如说-15|3
等于多少呢?有些人会觉得-15
转化为二进制就是10001111
,而3转化为二进制就是00000011
,那么结果应该是10001111
呀,转换为十进制就是-15呀?大家可以自己写个demo
就会发现是不对的。要注意在计算机中所有的都是用补码的形式存储的,之所以上面介绍两个正数是对的,因为正数的反码和补码都是一样的。而负数求补码应该是出去符号位取反+1,我们再来看看这个题-15|3
,其中-15
的原码为10001111
,反码为11110000
,那么补码就是11110001
,然后3的补码为00000011
,两者进行或操作就是11110011
,你以为结束了么?还没有,再又要求它的原码了,原码就是补码再求补码再+1(是不是已经晕掉了?),也就是10001101
,结果就是-13。
1 | 求 -15|3 |
开始解他那道题
1 | short:16位,最大数据存储量是65536,数据范围是-32768~32767之间。 其实这个是基础知识,我们在计算机的存储里面 |
这样子结果就得到了:-4423。
如果大家喜欢我的文章,可以关注个人订阅号。欢迎随时留言、交流。如果想加入微信群的话一起讨论的话,请加管理员简栈文化-小助手(lastpass4u),他会拉你们进群。