进制

看这篇文章前,我想问你一个问题:
计算机我们都知道是二进制,那么负数是怎么表示呢
通篇文章以Java语言来讲。
Java中整型有4种,byte ,short ,int ,long.分别占1字节,2字节 ,4字节 , 8字节。
我们人类是十进制,因为10根手指。
计算机最开始是发光二极管,这个我不是很确定,全当它是真的,那么就只有两种状态发光以及不发光。
那么我们想和计算机对话,那不就是和外星人对话一样吗,啥也听不懂。
那么用最简单的数字来举例,我们人类有-1,0,1.计算机怎么获取以及告诉我们人类呢

正数

以byte类型来举例,为什么呢,它只有一个字节,只用写8位,然后取值范围是 -128 -到127,这个范围我会讲到的 。
那我们人类的正整数 1在计算机里怎么表示呢
短除法来解决这个问题,这个不会自行百度。所以人类的1在计算机里面就是 0000 0001 .,正数的原码,反码,补码都是一样的。

byte b1 = 0b1 ;
 //这就是人类的1,前面的0b是二进制的表示方式,是零b

那么人类的0怎么表示呢

byte b0 = 0b0 ; 
//这就是人类的0

那么到了难点,人类的-1怎么在计算机里面表示呢
这个就要知道原码,反码,补码这三个概念。

所有数字都是以补码形式存在计算机里的。
正数的补码,反码,原码是一样的。计算出原码,也是补码,反码

负数要好好讲讲。

以人类的 -1 为例子
人类的-1的正数是 1
人类的1的二进制为 0000 0001 ,这是原码,八位中最高位为符号位,0为正数,1为负数,这就能解释为什么正数最大只能到 127,0111 1111 这个数是最大的正数,因为最大的位数是符号位 1+2+4+8+16+32+64 = 127
反码:原码除了符号位(即最高位)其他位取反,即0变为1,1变为0
人类的-1原码为:1000 0001
其反码为:1111 1110
补码:反码加+1,任何一位满2进位,加到最高位(即符号位的下一位)如果还满2那么进一丢失
其补码为:1111 1111
那么计算机里面就是用1111 1111表示人类的-1.

经典面试题

		byte b = 1;//这里定义为short类型是一样的结果,报错

		b = b + 1;
	//问你b的值

如果你回答2,恭喜你出局了,面下一家去吧。
为什么是错的呢,b = b + 1 ;这行会自动报错。这行代码意思是将 b +1 的结果赋值给b,但是报错了,b定义时是byte类型,但是在运算是会被识别为int类型,但是你又返回byte类型的b,大类型转小类型需要强转,会出现问题。

byte b = 1 ;
b++ ;

自增运算是带类型运算的,这个是不会报错的。

二进制-与运算 &

和数学里面的且是一样的,都真则真,一假则假。翻译一下:都是1结果就为1,有一个0结果就是0。
符号是 &
3 & 5

0000 0011
0000 0101

========
0000 0001
结果为人类的1

二进制-或运算 |

和数学里面的或一样,一真为真,都假为假。翻译一下:都是0结果就为0,有一个1结果就是1。
符号位 |
3 & 5

0000 0011
0000 0101

========
0000 0111
结果为人类的7

逻辑运算 && 和 ||

  • && 和 &运算道理是一样的。
  • || 和| 运算道理是一样的。
  • 但是逻辑运算&& 和|| 有短路效果。什么意思,例如 0 && 5 ,&&前面是0 ,那么程序不会识别 &&后面的了,自动给结果判断为0,假;还例如 1 || 8 ,||前面为真,那么就不会判断 ||后面的值了,结果判定为1,真。

取反和非运算

java中取反是利用 ! ,一般作用于boolean变量。true 变false,false变为true
二进制的非运算符号是~, 0 变为1,1变为0.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值