计算机存储和进制转换

计算机的存储单位

​ 计算机只能识别二进制数据,也就是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示例 
128用二进制表示为  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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值