OK 现在对函数中局部变量在内存中的排列有了个大致的认识,那么这些数据在内存中又是怎么转换得呢?正负数又是如何表示的呢?整数类型和浮点数,在内存中转换方式是一样的么?string又是怎么样的?结构体,枚举,类又是怎么样的?什么是堆,什么又是栈?哈哈脑子中是不是有好多问号?没关系,包子要一口一口的吃,水要一口一口的喝。莫急!莫急。 让我们先把有符号整数在内存中的转换搞清楚先!有符号搞明白了,无符号数也就不功自破了! Int类型最为常用,那就拿他开刀吧(short, long 和int的转换方式是一样的,只是占用空间大小不一样。搞明白后,可以自己调试查看!)
int number1 = 0x12345678;
int number2 = -1;
F10走
嗯,我们定义的数是0x12345678; 那内存中怎么显示的是 78 56 34 12 呢? 好,我让你写一个数:一百八十二 182 很好,完全正确。这是默认的表现方式,百位在最左边,十位在中间,个位在最右边 我现在要求你百位写在最右边,十位写在中间,个位写在最左边,怎么写? 281 嗯,又对了。那这个数还是一百八十二么?当然是喽。只是读取顺序变换了一下。如果还按照以前的方式解读,当然读取的就肯定不是我们想要的数字了
Intel Cpu是按照高地址存放高位,低地址存放低位的方式存储数据的!所以内存窗口中0x12345678显示为78 56 34 12 好存放顺序搞懂后,我们再看看,正负数又是怎么表示的。
1在内存中存储的很容易搞懂,那么为什么-1在内存中显示的是全1呢? 哈哈还是因为计算机很笨,他只会算加法不会算减法,聪明的科学家就想出了一个好办法又给这方法起了个吓人的名字“补码表示法”就是把减法转换成加法。 对于任何一个4字节数,x + x(取反) = 0xFFFFFFFF;(取反就是0变1, 1变0) 0xFFFFFFFF + 1 = 0(4字节空间最多只能存放32位,那相加后进得那1位放到哪里去了呢?当然是丢掉不要了!这样就得出我们想要的结果了!实现目的才是最重要的。)。所以 x + x(取反) + 1 = 0;So x的相反数就等于 x(取反) + 1即 -x = x(取反) + 1; X - X 就转换成了 X + X(取反) + 1 = 0; 减法最终于转变成了加法,哈哈。这些科学家家真是聪明。听说这个世界就是被数学家所统制的。看来是真地! 例如: -1 = 1(取反) + 1
那无符号呢,当然就是没有符号号位喽,所有32位都是有效数字位。所以相同位数的无符号数,表示的正数的范围要比有符号数大得多了!搞定!休息! |