Java中没有无符号操作吗?为什么C语言又有无符号左移呢?逻辑左移,算术左移是什么意思?学了C语言,和Java的东西放在一起,就混淆了...来梳理一下
关键:弄清楚各个概念...
一、有符号数和无符号数有符号数:二进制首位表示符号位,1表示正数,0表示负数。除去首位,其余位表示数值大小。
有符号的char表示的数值范围是 -2^8 ~ 2^8-1
无符号数:二进制首位就是普通位数。每一位都用来表示数值。
无符号的char表示的数值范围是 0 ~ 2^8-1
Java的原始类型里没有无符号类型 <=> Java的二进制首位1表正数,0表负数,是符号位
二、逻辑移动和算术移动逻辑移动:无符号移动
算术移动:有符号移动
三、区分Java和C语言中的逻辑移动和算术移动左移只有一种,左移在所有语言中只是左移。
右移运算分两种:
1. 逻辑移位 -- 左边用0填充,右边丢弃
2. 算术移位 -- 左边用原该值的符号位填充,右边丢弃
怎么理解左移只有一种,而右移有两种呢?
首先,移动的关键是补位:左移补右边的二进制位,右移补左边的二进制位。其次,符号位只可能在左边。只有补左边的二进制位时,才会考虑有符号数(高位补符号位)还是无符号数(直接补 0)
先说左移
操作:最左侧位丢掉, 最右侧补 0(不管是Java还是c语言,左移只有一种,操作相同)
左移的数学意义.在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方.
再说右移Java没有无符号数。java中有”无符号右移“,没有无符号左移
如果进行无符号左移的话,Java的符号位就被丢掉了,相当于没有符号位了。没有符号位不就变成无符号数了吗?!
C中的无符号数
只能是逻辑右移,没有符号位,也就不存在算数右移(有符号右移)的情况
C中的有符号数
可以算数右移也可以逻辑右移
① 对于有符号数的算数右移的方法是: 所有位数整体右移(包括符号位),每移动一位在最左边增加一个符号位(正数0负数1),最右边丢弃一位
② 对于有符数的逻辑右移的方法是: 所有位数整体右移,高位补0。测试情况:正数的情况下每逻辑右移一位就是除2,负数情况下,逻辑右移变正数
移动的数学意义总结:
左移在不溢出的情况下.正负数都是左移一位乘以2.
右移:算数右移和逻辑右移:负数基本都没有实际意义,只有正数有意义,右移一位相当于除以2



