c语言 java 有符号数,无符号数. 左移,右移运算

lynjay 2020-06-14

1: c语言区分有符号数,无符号数.有符号数是符号位在首位,无符号数首位就是普通位数. java只有有符号数,换句话说java二进制中首位都是符号位.0正1负.
 
2: 左移在所有语言中只是左移,不存在有符号无符号左移的说法,也不存在算数左移,逻辑左移的说法.算数移动(又叫有符号移动),逻辑移动(又叫无符号移动)都是指的右移,左移只有一种.
 
3: 先说左移
    ①: java中左移(java只支持有符号数). 首位不变,从第二位开始整体左移,右边补0,左边的扔掉.
       当左移的运算数是int 类型时,每移动1位它的第31位就要被移出并且丢弃.当左移的运算数是long 类型时,每移动1位它的第63位就要被移出      
       并且丢弃.
    ②: c中的左移分为有符号数无符号数, 无符号数很简单,就是整体左移,左边扔点,右边补0.  有符号数的左移与上面说的java中的有符号左移类似.
    ③: 左移的数学意义.在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方.
 
4: 再说右移: c中区分有符号数与无符号数,java只有有符号数.有符号数的右移区分有符号右移(算数右移)和无符号右移(逻辑右移).java只支持有符号          
   右移.所以不单独说,只说c的就可以了.
    ①: c语言中的无符号数只能是逻辑右移.没有符号位,也就不存在算数右移(有符号右移)的情况.计算非常简单.右移一位就是除2. 
    ②: c语言中的有符号数可以算数右移也可以逻辑右移. 与java相似,java中的数字算数右移是<<,逻辑右移是<<<. C中多数机器都是有符号
         右移. 
    ③: 对于有符号数的算数右移的方法是: 所有位数整体右移(包括符号位),每移动一位在最左边增加一个符号位(正数0负数1),最右边丢弃一位
          经过测试,正数每算数右移一位就是除2. 负数的话不是除2.只是很相近而已.
    ④: 对于有符数的逻辑右移的方法是: 所有位数整体右移.高位补0. 测试情况:正数的情况下每逻辑右移一位就是除2.负数情况下,逻辑右移变正数
         不具备数学意义.

相关推荐