天天看点

msp430中如何连续对位进行取反_C入门:C语言中数据的储存(上)

msp430中如何连续对位进行取反_C入门:C语言中数据的储存(上)

How Data is stored in computer memory?

储存数据是计算机进行各种数据操作的基础,为了理解计算机可以对哪些数据进行怎样的操作,有必要了解数据在计算机中的储存方式。

msp430中如何连续对位进行取反_C入门:C语言中数据的储存(上)

为了有效防止失真,提高数据的准确性和稳定性,计算机使用二进制的方式来储存数据(关于精妙的底层逻辑,建议参考清华大学王红老师的课程《数字电子技术基础》),0和1便是计算机逻辑语言,相应的采用两段范围电压的相对高低(高电平,低电平)来用于机器语言,很多情况下我们采用高电平对应1的正逻辑。理解数据的二进制储存,就时在探讨各种数据与二进制数据之间的转换。

我们通常讲每一个储存0或1的最小内存单元称作位(bit),将连续的8位称作一字节(Byte)。如上图所示。

最初我们多用计算机储存数值类数据。常见的数字量数据,在C语言中我们有int(integer)和int的各种派生数据unsigned int,long int,short int....又是需要表示模拟量,然而实现模拟量和二进制的转换是不现实的,于是用浮点型数据float,double来近似表示模拟数据,根据误差要求选择不同精度的浮点型数据。随着发展,我们对储存文字信息的需求越来越大,相应的有char类型数据来表达常用字符,随着计算机在世界范围的普及,char所能表示的字符已经远远不够了,于是有了各种各样的char类型的扩充,也有了更多的国际码制标准。

How integers are stored in memory?

msp430中如何连续对位进行取反_C入门:C语言中数据的储存(上)

实现二进制和十进制的转换是容易的,将十进制整数a转换为二进制表示所需最小位数位n,只需n与a之间满足

msp430中如何连续对位进行取反_C入门:C语言中数据的储存(上)

。然而为了表示符号位,必须要再多一位来表示符号。这又造成了问题,编码的时候符号位应该放到哪里?译码的时候如何识别符号位?

前人智慧的积累,最终计算机使用一种特殊的编码方式来储存整数。

以最高位(MSB ,most significant bit)作为符号位,MSB=0表示正数,反之表示负数。这样的编码方式不仅易于计算机理解符号,而且其所具有的正负数特有的补码关系使得减法运算变得容易。

msp430中如何连续对位进行取反_C入门:C语言中数据的储存(上)

如上图,+10用二进制表示为1010,要得到-10只需将1010各位取反然后再加1(即补码),如果将两者相加会发现在有效位数内和为0。(关于补码建议听王红老师的课)。这种编码方式对计算机是有好的,取反(反向器)加1(加法器)都是可硬件实现的。将负数以补码的形式表达将减法运算转换为求和运算,也使得硬件实现变得可能。

以此逻辑,4byte的int型数据表示范围为

msp430中如何连续对位进行取反_C入门:C语言中数据的储存(上)

~

msp430中如何连续对位进行取反_C入门:C语言中数据的储存(上)

,将符号位当作数值位的unsigned int表示的范围为

msp430中如何连续对位进行取反_C入门:C语言中数据的储存(上)

~

msp430中如何连续对位进行取反_C入门:C语言中数据的储存(上)

How character is stored in Computer

char型数据本质上和 int 相同,都是储存二进制整数值

,在计算机看来,他们仅仅是 size 和 range 不同罢了( int 4字节,char 1字节),进行运算处理的方式完全一样。我们常常觉得char和 int 差别很大,因为我们在创建一个char数据时更多用于输入输出到屏幕或文件,当使用有关函数时,会对 cha r数组做特殊处理并且以ASCII码做相应的转换。

char 并不神秘。
msp430中如何连续对位进行取反_C入门:C语言中数据的储存(上)

ASCII码是我们最常用的字符码制了,如果要处理更多字符(例如汉字)的话,还需要去了解国际上更全面的码制。

How float or double values are stored in memory?

msp430中如何连续对位进行取反_C入门:C语言中数据的储存(上)

以float(单精度浮点型)为例,分配4字节(32位)内存

由1bit符号位,8bit指数位和23bit有效位构成。

msp430中如何连续对位进行取反_C入门:C语言中数据的储存(上)

可以看到double和float只是不同部分位数的区别,本质是相同的,接下来以float为例介绍。

## How to convert floating numbers into binary numbers ?

浮点型数据转换为二进制会有些不同,因为小数部分和二进制并非11对应的,就像0.5无法用2^n^(n为整数)来表示,这就造成了精度问题,相应的便有单精度float和双精度double数据来应对不同的误差要求。

为了搞明白小数部分的二进制表示,我们先回顾十进制

e.g. 我们如何理解4.23

4.23整数部分为4;
		4.23小数部分为0.23;
		如何获得小数点后第一位数据,只需将其x进制数
		0.23x10=2.3
		我们可得到第一位为2
		再将0.3x10=3
		我们得到第二位为3
           

可以看到将小数部分每x一次n进制,就会有一次整体的进位。此时得到的小数点前的第1位即为刚才小数点后的第一位

同样的思路操作二进制

e.g.

4.23整数部分为4--->100;
小数部分为0.23;
0.23x2=0.46--->0
0.46x2=0.92--->0
0.92x2=1.84--->1
0.84x2=1.68--->1
0.68x2=1.36--->1
0.36x2=0.72--->0
           

显然我们得到了一个无限不循环小数100.001110.....

这样我们就把浮点类数据表示成了二进制数据

## Make the converted binary number to normalize form

为了在计算机中储存这些数据,我们需要将其规范化,一般化

如上例子100.001110.......=1.00001110....x2^2^

其中1.100001110....为

significant bit

,将决定浮点数的

精度

2^2^(*指数那个2*)为

exponent bit

,将决定浮点数的

范围

我们终于表达了浮点数的大小(*鼓掌*)

然而如何表示负值,浮点数是没有补码反码这种操作的。同样的以MSB的取值来表示符号,特殊的是,将exponent bit在加上

msp430中如何连续对位进行取反_C入门:C语言中数据的储存(上)

,即添加一个较大的正数部分使之无论正负均为正值。如上例子1.00001110....x

msp430中如何连续对位进行取反_C入门:C语言中数据的储存(上)

,其exponent bit最终结果为

msp430中如何连续对位进行取反_C入门:C语言中数据的储存(上)

+1=129.

由于我们采用科学计数法(*我想应该是这么称呼的吧*)表示,而且是二进制只有0和1,那么形式总会是1.xxxxx,无需浪费一位来表示小数点之前的1,所以在计算机储存浮点类型数据时,是不会储存这一位的。

msp430中如何连续对位进行取反_C入门:C语言中数据的储存(上)

0.75在计算机中的储存形式。

根据这个储存方式不难得出,float的最大精度为

msp430中如何连续对位进行取反_C入门:C语言中数据的储存(上)

,可表示最大数值为

msp430中如何连续对位进行取反_C入门:C语言中数据的储存(上)

note:**

关于这样表示浮点数据的原理及其计算和输出输出方法我还没搞明白,我再研究研究再写吧,当然希望已经搞明白的小伙伴分享一下啦

**

一只小白猿,技术超有限......

还望小伙伴能指出小白猿的错误,一起学习,一起分享

msp430中如何连续对位进行取反_C入门:C语言中数据的储存(上)

微信扫描二维码关注小白猿啦

继续阅读