您的当前位置:首页正文

计算机内存数值存储方式&进制

2024-11-27 来源:个人技术集锦

进制概念

进制也就是进位制,是人们规定的一种进位方法。对于任何一种进制,x进制表示某一位置上的数运算时是逢x进一位。十进制是逢十进一、十六进制是逢十六进一、二进制是逢二进一。

各进制数表示

八进制是逢8进1,所以到8的时候向前进一位,变成10;十六进制10-15用A-F表示,逢16向前进一位,即为10(所有进制都是从最小0开始)

64进制,所用的字符是0-9,a-z,A-Z,+,/

“0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/”

二进制

二进制数据是用0和1两个数码来表示的数,规则是逢二进一

bit(比特):一个二进制代表一位,一个位只能表示0或1两种状态。数据传输习惯以“位”(bit)为单位

Byte(字节):一个字节为8个二进制位,计算机中最小的存储单位是字节。数据存储习惯以“字节”(Byte)为单位

1k=1024个字节(B)

八进制

一种以8为基数的计数法,采用0,1,2,3,4,5,6,7八个数字,逢8进1。以数字0开始表明该数字是八进制。

八进制的数和二进制的数可以按位对应(八进制一位对应二进制三位)

十六进制

由0-9,A-F组成,字母不区分大小写

十六进制的数和二进制数可以按位对应(十六进制一位对应二进制四位)

进制转换

1. 十进制转二进制方法

- 十进制的整数转换成二进制

用十进制数除以2,分别取余数和商,商为0的时候,将余数倒着数就是转化后的结果

- 十进制的小数转换成二进制

小数部分和2相乘,取整数,不足1取0,每次相乘都是小数部分,顺序看取整后的数就是转换后的结果

1)乘的时候只乘小数部分

2)0.432只有3位,所以只需要3位,0 0 1 就停止计算

3)0.432的二进制数为:0.011 

2. 八进制与二进制转换

1)二进制转八进制

三位一组,将二进制数对应到十进制整数上(不超过8)

101  001  111  011

  5      1      7      3

 2)八进制转二进制

 1       2     5

001  010  101 

3. 十进制与八进制转换

1)十进制转八进制

用十进制数除以8,分别取余数和商,商为0的时候,将余数倒着数即为转化后的结果

4. 十六进制与二进制转换

0101  0111  1010  1011  0101

  5         7       A        B        5

5. 十进制转化十六进制

用十进制数除以16,分别取余数和商,商为0的时候,将余数倒着数就是转化后的结果

6. 其他转换

C语言表示相应进制数 

十进制        以正常数字1-9开头,如123

八进制        以数字0开头,如0123(在八进制数前加上0)

十六进制     以0x开头,如0x123(在十六进制数前加上0x)

二进制         c语言不能直接书写二进制数

其他

相关题目:leetcode 405题

二进制位运算左移:将一个运算对象的二进制位全部左移若干位,左边的二进制丢弃,右边补0

右移同理。

int val = 3;

int ans = (val >> 4) & 0xf;   

// 0xf 是16进制写法 ,等于十进制的15,等于二进制的1111,& 0xf表示取变量的后四位

内存数值存储方式

1. 原码

原码(原始的二进制码),特点:

(1)最高位作为符号位,为0表示正数,1表示负数

(2)其他数值部分就是数值本身绝对值的二进制数

(3)负数的原码是在其绝对值的基础上,最高位变为1

以1字节(8位)的大小描述:

十进制数原码
+150000 1111
-151000 1111

+0          

-0                      

0000 0000  

1000 0000

原码不方便加减运算

2. 反码

(1)对于正数,反码和原码相同

(2)对于负数,符号位不变,其他部分取反(1-->0, 0-->1)

(3)反码运算也不方便,通常用来作为求补码的中间过渡

3. 补码

在计算机系统中,数值一律使用补码来存储

(1)对于正数,原码、反码、补码相同

(2)对于负数,补码为反码+1

(3)补码符号位不动,其他位取反,最后整个数+1,得到原码

#include <iostream>

int main() {
  int val = -15;
  // printf("%x\n", val);  // c语言写法
  std::cout << std::hex << val << std::endl; // 十六进制
  return 0;
}

// 输出结果为fffffff1 (补码)
// fffffff1 对应的二进制:1111 1111 1111 1111 1111 1111 1111 0001
// 符号位不变,其他取反:  1000 0000 0000 0000 0000 0000 0000 1110
// 上面+1得到原码:       1000 0000 0000 0000 0000 0000 0000 1111(最高位1表示负数,-15)

计算机中使用补码存储的原因:

  • 统一了正负0的编码
  • 正负数加减运算结果是正确的(同十进制计算结果)

        - 将符号位和其他位统一处理

        - 将减法运算转变为加法运算

        - 两个补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃

显示全文