栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

为什么Java中没有无符号左移操作

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

为什么Java中没有无符号左移操作

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/769046.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号