一切皆数据

取了一个非常高大上的名字。但是本人并没有太过深入的了解c语言。也只是一个c语言的初学者。所以请各位大神华丽的无视掉这篇文章。

我学过一点汇编,现在处于逆向工程的起步阶段。在学习汇编和对c语言反编译汇编代码的阅读中的得到一些的一些感悟记录在这里。作为备忘。(反正没人看

好的,现在开始。

也许新手在刚开始学习c语言的时候就会接触到各种各样的数据类型。什么int啊double啊之类的。各种各样的数据类型会让人晕头转向。更不要说各种自己定义的类型了。

但是,这些各种各样的数据类型究竟是什么呢?让我们来看看这些数据在内存中的储存情况。
这是一个int型的变量

0x00000023

前面的0x是16进制的意思这个谁都知道。后面是一个占32位,4字节的16进制数字,表示十进制数35。

再来看看浮点数float

0x00 00 f6 42

这个浮点数值是123,具体浮点数是如何表示的暂且不提,但是他依然是占用4字节,32位的16进制数

再看看常见的char型数据。

0x32

这个短一点,占8位,1字节。相信稍微学过c语言的人都能猜出他的含义,就是字符’2’
现在我给一个数据,来猜猜它代表了什么。

0x32333435

猜不出来吧,它可能是int型的数字842216501,可能是float型的数字1.66889336e-7,甚至可以是4个char型数据排在了一起分别是’1’,’2’,’3’,’4’。谁知道是什么。

但是,这确实是数据在内存中的储存方式。

1
2
3
4
5
6
7
8
9
10
00 00 00 00 00 00 00 00 00 e0 fd 7e  
00 00 00 00 00 00 00 00 00 00 00 00
b8 fd 25 00 00 00 00 00 ff ff ff ff
85 19 fc 76 ae d2 84 01 00 00 00 00
04 fe 25 00 85 92 f8 76 0e 11 04 01
00 e0 fd 7e 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 0e 11 04 01
00 e0 fd 7e 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00

这里是我截取的,我电脑中随意一段内存的内容,可以看见都是这些16进制的数。那么我们的计算机大大是如何知道每一个字节的内容代表的是什么含义的呢?

答案是计算机并不知道这些东西是什么含义的,计算机只能机械的执行我们的指令,他不会自己理解这些内容的含义。一串16进制数究竟表示什么含义需要由你,编辑程序的人来制定。只要指定了这一串16进制数据长度和它代表的含义。计算机会忠实的按照你指定的含义来理解,操作数据。

这就是c语言中,数据类型的由来。数据类型,就是标明一个16进制的数据应该是什么含义,告诉计算机怎么解读一个数据。这样也就很好理解一个字符型的变量也可以进行数字的运算了。因为它的本质是16进制数。

其实不仅仅是各种数据类型的本质是一样的,包括你写的代码,包括各种图片声音其实都只是一些16进制数。告诉计算机数据有多长,是什么含义,计算机就会按照你的意识解读数据。

同样,c语言中一个变量的含义也就很明显了。其实你声明一个变量,比如 int a;那么变量a其实就表示了2种信息。一个是a的地址,关于地址我们下次再讲。再一个就是a的数据类型。也就是如何解释a中数据,告诉计算机数据的含义。

PS:学的越多,知道的越少。其他高级语言有的将数据抽象成了数据结构和对象等概念。渣渣不会Orz,有兴趣的可以去了了解一下。