Java 中 byte 类型初始化问题
很早的时候由于工作需要,接触过一点 Java,于是有了这个坑,今天回头看到自己在 Stackoverflow 上提的问题发现了它,于是再记录下。
在使用中,需要将 byte 类型的的每一位都置 1。我万万没有想到这么一个简单的操作,在 Java 中有各种约束。
首先看看代码:
// 方式 1
byte allBitsOne = 0xFF;
// 方式2
byte allBitsOne = (byte)0xFF;
// 方式3
byte allBitsOne = 0xFFFFFFFF;
上面的哪个方式可以达到将 byte 类型的每一位都置 1 的需求呢?答案就是 2,3。
为什么方式 1 不可以呢?
因为在 Java 中,整型字面量(literal integers)是采用的固定的有符号 32 位整型来表示的。而 byte 类型在 Java 中又是一个有符号的 8 位类型,表示范围是十进制 -128~127。于是 0xFF 代表的十进制 255 超过了 byte 类型的表示的范围。
为什么方式 2 可以呢?
因为 0xFF 这个 32 位整型来说,低 8 位都是 1,现在用 (byte) 强制转换一下,将其多余的高位都丢弃,于是剩下的 8 位都是 1 的 byte 赋值给左边。
为什么方式 3 可以呢?
因为在 Java 中,整型字面量(literal integers)是采用的固定的有符号 32 位整型来表示的。并且是采用的补码的形式,那么对于 0xFFFFFFFF 它所表示的数的绝对值就是各位按位取反后 + 1,可以知道绝对值是 1,而最高位是符号位,于是表示的就是 -1,再根据 byte 类型在 Java 中可以表示 -128~127,所以可以赋值,而 -1 在 byte 类型上就是每一位都是 1。
我觉得坑有两个:
- 为什么 byte 类型在 Java 中要被设计成
Int8而不是UInt8? - Java 的类型系统太不灵活了,看看人家 Swift 中的 literal
Java 中 byte 类型初始化问题的更多相关文章
- 关于JAVA中Byte类型的取值范围的推论(*零为正数,-128在计算机中的表示方法...)
先看一段推理<*一切都是在8个比特位的前提下,讨论二进制的符号位,溢出等等,才有意义*> +124:0111 1100 -124:1000 0100 +125:0111 1101 -125 ...
- Java中Byte类型数据在运算中的问题
比如: byte a=1; byte b=2; byte c; c=a+b; //这样是计算不出c,是错误的 c=a+1; //这样也是不能计算c的 c=64+1; //为什么这样就能计算c,在Jav ...
- java中byte类型
http://www.cnblogs.com/Robotke1/archive/2013/05/25/3099309.html ------------------------------------ ...
- 【转】java中byte数组与int类型的转换(两种方式)----不错
原文网址:http://blog.csdn.net/piaojun_pj/article/details/5903009 java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法, ...
- Java中的成员初始化顺序和内存分配过程
Java中的成员初始化顺序和内存分配过程 原帖是这样描述的: http://java.dzone.com/articles/java-object-initialization?utm_source= ...
- JAVA中值类型和引用类型的不同(面试常考)
转载:https://www.cnblogs.com/1ming/p/5227944.html 1. JAVA中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个 ...
- Java中String类型细节
Java中String类型细节 一 . String两种初始化方式 1 . String str1= “abc”;//String类特有的创建字符对象的方式,更高效 在字符串缓冲区中检测”abc”是否 ...
- - Java中boolean类型占用多少个字节 MD
目录 目录 Java中boolean类型占用多少个字节 1个bit(1位) 1个Byte(1字节,8位) 4个Byte(4字节,32位) 分析 官方文档中的描述 Markdown版本笔记 我的GitH ...
- Java中boolean类型占用多少个字节?我说一个,面试官让我回家等通知
摘自:https://www.cnblogs.com/qiaogeli/p/12004962.html 程序员乔戈里 腾讯面试官问我Java中boolean类型占用多少个字节?我说一个,面试官让我回家 ...
随机推荐
- Servlet3.0使用@WebServlet注解配置问题记录
文档说@WebServlet的配置属性都是可选的,不是必需的. 经实践,将一个Servlet配置成load-on-startup的Servlet时,若只添加loadOnStartup属性,该Servl ...
- 【翻译自mos文章】在11gR2 rac环境中,文件系统使用率紧张,而且lsof显示有非常多oraagent_oracle.l10 (deleted)
在11gR2 rac环境中,文件系统使用率紧张.而且lsof显示有非常多oraagent_oracle.l10 (deleted) 參考原文: High Space Usage and "l ...
- ini配置文件的读取
.ini 文件是Initialization File的缩写,即初始化文件.是windows的系统配置文件所采用的存储格式,统管windows的各项配置,一般用户就用windows提供的各项图形化管理 ...
- CDN新应用和客户
目前的CDN配置服务主要应用于证券.金融保险.ISP.ICP.网上交易.门户网站.大中型公司.网络教学等领域.另外在行业专网.互联网中都可以用到,甚至可以对局域网进行网络优化.利用CDN,这些网站无需 ...
- 算法笔记_103:蓝桥杯练习 算法提高 金明的预算方案(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:“你的房间需要购买哪些 ...
- 网络编程-Java中的Internet查询
前提 在深入理解URL.URI等概念,或者学些Socket相关的知识之,有必要系统理解一下Internet相关的一些基础知识. Internet地址 连接到Internet(因特网)的设备称为节点(n ...
- 为LoadRunner写一个lr_save_float函数
LoadRunner中有lr_save_int() 和lr_save_string() 函数,但是没有保存浮点数到变量的lr_save_float函数.<lr_save_float() func ...
- Ubuntu 11.04 安装后要做的20件事情
转自:http://www.cnbeta.com/articles/141137.htm #1 不喜欢Unity? 切换到Ubuntu gnome 经典桌面 注销unity桌面环境,然后选择登录环境为 ...
- Python之print详解
Python之print详解 http://www.jb51.net/article/55768.htm print的一些基本用法,在前面的讲述中也涉及一些,本讲是在复习的基础上,尽量再多点内容. ...
- tomcat+nginx+redis集群试验
Nginx负载平衡 + Tomcat + 会话存储Redis配置要点 使用Nginx作为Tomcat的负载平衡器,Tomcat的会话Session数据存储在Redis,能够实现0当机的7x24 运 ...