计算机的存储单位
计算机只能识别二进制数据,也就是0和1(0和1实际上对应的是高低电平,或者磁极方向等),对应0和1的最小存储单位是bit,bit是数据传输的最小单位。人们又规定特定位数的0和1组合在一起,表示特定的信息含义,例如ACSSII码就是通过8个bit存放的0和1来表示表示特定的字符。8个bit组成的数据存储单位称为byte,这是最小的数据存储单位。
计算机存储单位 - 换算关系
位 bit (比特)(Binary Digits):存放一位二进制数,即 0 或 1,最小的存储单位。
1 byte(字节)= 8 bit
1KB = 210 bit = 1024 bit
1MB = 220 bit = 1024 KB
1GB = 230 bit = 1024 MB
1TB = 240 bit = 1024 GB
1PB …
1EB …
1ZB …
1YB …
1BB …
进制介绍和进制转换
进制也就是进位计数制,是人为定义的带进位的计数方法。 对于任何一种进制—X进制,就表示每一位置上的数运算时都是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。百度百科
二进制和十进制互转
10进制转2进制 以十进制数74示例
74 除以 2 商 37 余 0
37 除以 2 商 18 余 1
18 除以 2 商 9 余 0
9 除以 2 商 4 余 1
4 除以 2 商 2 余 0
2 除以 2 商 1 余 0
1 除以 2 商 0 余 1按余数倒叙排列:1001010 ,实际存储的二进制位不是8的倍数(8bit是数据存储的最小单位),左边补0处理, 所以此处是 01001010
二进制转10进制
以 0010101 为示例
0 * 27 + 1 * 2 6 + 0 * 2 5 + 0 * 24 + 1 * 23 + 0 * 22 + 1 * 21 + 0 * 20 = 37
二进制、八进制、十进制互转
二进制数 01001010 对应十进制数 74 对应8进制数 112
二进制转八进制
方法:3位二进制数对应一位8进制数(从右到左开始转换,不足时补0)
1、 01001010 是8位二进制数,从右到左按3位进行转换,不足补0。
拆分后为 001 001 010
2、 拆分后的数据进行计算
001 0 * 22 + 0 * 21 + 1 * 20 = 1
001 0 * 22 + 0 * 21 + 1 * 20 = 1
010 0 * 22 + 1* 21 + 0* 20 = 2
3、计算后组合的8进制数为 112
八进制转二进制
方法: 八进制数通过除2取余法,得到二进制数,每个八进制数对应3个二进制位,不足时在最左边补零
1、 八进制数112 拆分。 1 1 2 。
2、 单独对每一个八进制数进行除2取余法 ,不足时左边补0,凑3位。
1
1 除以2 商 0 余 1 --> 001
1
1 除以2 商 0 余 1 --> 001
2
2 除以2 商 1 余 0
1 除以2 商 0 余 1 --> 10 --> 010
3、 拼接
001001010 --> 01001010
八进制转10进制
112 > 1* 8 2 + 1 * 8 1 + 2 * 8 0 = 74
10进制转八进制
1、 除8取余法 ,以10进制数 74示例
74 除以 8 商 9 余 2
9 除以 8 商 1 余 1
1 除以 8 商0 余 1
2、 倒叙排列得到八进制数: 112
16进制和二进制互转
16进制表述特殊说面,10进制数转16进制数时,使用除16取余法,余数最大为15,当余数大于9时,使用字母表示
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 1 2 3 4 5 6 7 8 9 A B C D E F
10进制转16进制
以10进制数74为例
74 除以 16 商 4 余 10
4 除以 16 商 0 余 4
10用字母表示为A ,所以74转16进制为 4A
16进制转10进制
以16进制数4A为例
4 * 16 + 10 = 74
16进制转二进制
方法: 十六进制数通过除2取余法,得到二进制数,每个十六进制数对应4个二进制数,不足时在最左边补零
16进制数 4A
4转二进制为 100(具体转换参考上面8进制转换) , 补0之后为 0100
A 转 二进制为 1010,不用补0
拼接之后为 01001010
二进制转16进制
二进制数 01001010为例:
4位二进制数对应一位16进制数(从右到左开始转换,不足时补0) 0100 0 * 23 + 1 * 22 + 0 * 21 + 0 * 20 = 4
1010 1 * 23 + 0 * 22 + 1 * 21 + 0 * 20 = 10
拼接后16进制数为 4A
程序中对不同进制数的表示
java中对不同进制表示
int i = 0112; // 8进制
int j = 0x4A; // 16 进制
int k = 74;
System.out.println(i==j);
System.out.println(k==j);
// 结果为 true true
c语言中printf函数输出不同兼职
int x = 74;
printf("%x", x); // 以16进制格式输出
printf("%o", x); // 以8进制格式输出
printf("%d", x); // 以十进制格式输出
字符编码
编码发展历史请看:https://blog.csdn.net/dk_0520/article/details/70157426
简而言之,计算机通过二进制数据表示特定含义的信息,不同的编码标准,二进制数据对应不同的含义。
ASCII编码, 8个二进制位(8bit)表示一个特定字符。
GBK2312 16个二进制位表示一个字符
UTF-8使用1~4字节为每个字符编码:
1、一个US-ASCIl字符只需1字节编码(Unicode范围由U+0000~U+007F)。
2、带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字母则需要2字节编码(Unicode范围由U+0080~U+07FF)。
3、其他语言的字符(包括中日韩文字、东南亚文字、中东文字等)包含了大部分常用字,使用3字节编码。
4、其他极少使用的语言字符使用4字节编码。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U8K5gWKT-1670331872806)(https://baike.baidu.com/pic/ASCII/309296/1/e850352ac65c103880a07b53bc119313b17e8941?fr=lemma&ct=single#aid=1&pic=e850352ac65c103880a07b53bc119313b17e8941)]
二进制表示负数
正数的源码 --》 反码 -- 》 反码加1
以-28示例
1、28用二进制表示为 00011100
2、反码为 11100011
3、反码加1(逢二进一)表示为 11100100
用java代码进行验证
System.out.println(Integer.toBinaryString(-28));//由于int占4个字节,不足左边补一
输出结果为11111111111111111111111111100100
java中byte类型的极限是-128~127
127 二进制表示为 01111111
-128 用上面的方法进行转码表示为 10000000
这里左边第一位可以理解成符号位,但不是简单的表示正负
将byte按二进制输出:https://zhidao.baidu.com/question/1115031702245345779.html
二进制表示小数
例子:
0.23 * 2 整数部分为 0 小数部分为 0.46
0.46 * 2 整数部分为 0 小数部分为 0.92
0.92 * 2 整数部分为 1 小数部分为 0.84
0.84 * 2 整数部分为 1 小数部分为 0.64
0.64 * 2 整数部分为 1 小数部分为 0.24
0.24 * 2 整数部分为 0 小数部分为 0.48
0.48* 2 整数部分为 0 小数部分为 0.96
。。。。。。。。。。
参考:https://blog.csdn.net/sunming0129/article/details/79574836
二进制表示小数部分精度问题。
单精度浮点数占用4个字节(32位)存储空间来存储一个浮点数,包括符号位1位,整数8位,小数23位。
双精度浮点数使用 8个字节(64位)存储空间来存储一个浮点数,包括符号位1位,整数11位,小数52位。
public static String getCode(String content, Charset format) {
byte[] bytes = content.getBytes(format);
StringBuilder sb = new StringBuilder();
for (byte aByte : bytes) {
// 0xff为16进制,转2进制为11111111 ,"1中国人"中1 对应的二进制数为00110001,按位与操作
sb.append(Integer.toHexString(aByte & 0xff).toUpperCase()).append(" ");
}
return sb.toString();
}
参考:https://cloud.tencent.com/developer/article/1353743