原创 Maye426 C语言Plus 2020-11-18

收录于话题

#汇编从入门到入土

3个

汇编数据的表示

汇编语言程序员处理的是物理级数据,因此他们必须善于检查内存和寄存器。通常,二进制数被用于描述计算机内存的内容;有时也使用十进制和十六进制数。所以必须熟练掌握数字格式,以便快速地进行数字的格式转换。

        每一种数制格式或系统,都有一个基数(base),也就是可以分配给单一数字的最大符号数。下表给岀了数制系统内可能的数字,这些系统是硬件和软件手册中最常使用的。

系统基数可能的数字
二进制201
八进制801234567
十进制100123456789
十六进制160123456789ABCDEF
二进制整数

计算机以电子电荷集合的形式在内存中保存指令和数据。大家可以理解为电灯的开和关,分别代表1和0。二进制数(binary number)用 2 个数字作基础,其中每一个二进制数字(称为位,bit)不是 0 就是 1(和电灯一样,不是开就是关)。

位自右向左,从 0 开始顺序增量编号。左边的位称为最高有效位(Most Significant Bit, MSB)右边的位称为最低有效位(LSB, least significant bit)。一个 16 位的二进制数,其 MSB 和 LSB 如下图所示:

汇编中的数据表示以及奸商的内存换算_C语言

二进制整数,又可以分为有符号和无符号(即是否能表示整数和负数)。对于无符号整数来说,默认看作正数,就算你存入负数也会被解析成正数,对于有符号来说,既能表示正数,也能表示负数,不过相对应的,能表示的范围也要小一点,因为最高位被用来表示符号位,从而使能表示的有效数据少了。

学过C语言的都知道char的存储范围是[-128~127],而uchar的存储范围是[0~256],这就是区别。

各种进制之间的转换

鉴于大家都学过C语言,所以在各种进制之间的转换上面,就不花精力详细介绍了,给大家一张详细的转换方法图:

汇编中的数据表示以及奸商的内存换算_C语言_02

最小信息表示单位(byte)

计算机中,所有数据存储的基本单位都是字节(byte),一个字节有 8 位(八个二进制),其他的存储单位还有字(word)(2 个字节),双字(doubleword)(4 个字节)和四字(quadword)(8 个字节)。

下图展示了每个存储单位所包含的位的个数:

汇编中的数据表示以及奸商的内存换算_C语言_03

怎么计算不同的类型的取值范围呢?

无符号整数:0~2^n (n代表类型的位数)

有符号整数:-2^(n-1)+1 ~ +2^(n-1)

用知识思考问题,为什么买的硬盘内存会少一些?

首先,不是卖硬盘的商家是奸商,而是和计算机的存储单位换算不同导致的。

然后,大家都知道

1字节 = 8位

1千字节 = 2^10或1024字节

...后面每个相邻的单位之间,都是以1024进行换算


大家注意到没有,单位本来因该是1024,但是商家却为了方便,丢掉了24,仅用1000来计算,那么当内存很大的时候,我们丢失的空间就越大。

我们一起来算一下,以128G为例(2^7):

商家:128 ×1000 × 1000 × 1000 =128,000,000,000(byte)

计算机:128 × 1024 × 1024 × 1024 =137,438,953,472(byte)

差值:137,438,953,472-128,000,000,000=9,438,953,472

9,438,953,472/1024/1024/1024=8.79G

这一下就少了块9个GB了,天啦~~


更快的换算方法:通过商家的单位计算出字节之后,然后按计算的的单位求出GB。

128,000,000,000/1024/1024/1024=119.2092895507813

128-119.2092895507813=8.79072