初学开发的时候(我的第一门语言是JAVA,android方向),基本很少考虑java中基本类型的占用字节数。
直到工作中接触到串口通讯,与单片机通讯,看着那些通讯文档,看着例如Uint16
、Uint32
、Uint64
、Char(16)
、Char(64)
等等这些值类型的时候才发现一头雾水。
下面先讲讲java中的基本类型占用的字节数。文章最后再讲讲这些值类型的意思。
一. java中基本类型占用字节数
借鉴:http://www.jianshu.com/p/fd560bc39adb
1. 整型
类型 | 存储需求 | bit数 | 取值范围 | 备注 |
---|---|---|---|---|
int | 4字节 | 4*8 | -2147483648~2147483647 | 即 (-2)的31次方 ~ (2的31次方) - 1。 为什么是31而不是32?因为第一位是符号位,用来表示正负的 |
short | 2字节 | 2*8 | -32768~32767 | |
long | 8字节 | 8*8 | ||
byte | 1字节 | 1*8 | -128~127 |
2. 浮点型
类型 | 存储需求 | bit数 | 取值范围 | 备注 |
---|---|---|---|---|
float | 4字节 | 4*8 | float类型的数值有一个后缀F(例如:3.14F) | |
double | 8字节 | 8*8 | 没有后缀F的浮点数值(如3.14)默认为double类型 |
3. char类型
类型 | 存储需求 | bit数 | 取值范围 | 备注 |
---|---|---|---|---|
char | 2字节 | 2*8 | Java中,只要是字符,不管是数字还是英文还是汉字,都占两个字节。 |
至于为什么 Java 中 char 无论中英文数字都占用2字节,是因为 Java 中使用 Unicode 字符,所有字符均以2个字节存储。
而如果需要识别字符是否为中文,可以使用正则匹配式:
String _regex = "[\\u4e00-\\u9fa5]";
4. boolean类型
类型 | 存储需求 | bit数 | 取值范围 | 备注 |
---|---|---|---|---|
boolean | 1字节 | 1*8 | false、true |
二. 为什么java中int占4个字节。
- int是最基本的类型,一般和CPU的字宽一致。
- 操作系统16位的时候,int 2字节,操作系统32位的时候,int 4字节,由于32位系统之前占主流地位,实际现在就算是64位系统,出于兼容性考虑,int也是4字节的
- 一个字节占8位,所以:32/8 = 4个字节
三. Uint16、Uint32、Uint64、Char(16)的意思
- Uint16表示规定一个int占16位,16/8=2个字节,所以你需要把int转换成2个字节进行传输,也就是byte[2]。
- 注意,如果直接用强转的方式,例如
(byte)1
,这里1是被转成一个字节,一个字节只能表示-128~127。 - 如果想要把一个int值转成4个字节byte[4],请看另一篇文章: java中byte[ ]和各种数据类型的相互转换
- 注意,如果直接用强转的方式,例如
- Uint32表示规定一个int占32位,32/8=4个字节,所以你需要把int转换成4个字节进行传输,也就是byte[4]。
- Uint64表示规定一个int占64位,64/8=8个字节,所以你需要把int转换成8个字节进行传输,也就是byte[8]。
- Char(16)表示传输16个字节。至于一个char要占一个字节还是两个字节,要看具体的协议定制。只要接收和发送方按照相同的规则来解析转化即可。
- 例如要传输
passWord = “abcd”
这样一串密码 - 发送方如果用java的
byte b[] = passWord.getBytes()
,则b的长度是4位
,内容是:61 62 63 64(abcd的ASCII值的16进制)
(用getBytes方法的话,一个char一个字节) - 接收方只要同样按4个字节来解析即可,例如:
- 例如要传输
private String decode(byte[] b) {
char[] psw = new char[4];
for (int i = 0; i < psw.length; i++) {
psw[i] = (char) b[i];
}
return String.valueOf(psw);
}
网友评论