0.11 数据在内存的存储
Last updated
Was this helpful?
Last updated
Was this helpful?
数据在内存中到底是怎么存的?
这里,看看 long 和 int 到底是什么定义的。
大小决定使用范围! 这句话,讲的很好。
unsigned 和 signed 的用处? signed 最高位是有符号位,没有意义,不是有效数值。 但是,unsigned 就有意义,每一位都可以表示有效数值。 这一部分,我用红笔,隔开了。 没有负数的,就是 unsigned
先知道有什么,后面再说。
先知道后面再说,
补码可以把加法和减法统一处理。
计算: 1-1 >> 1+(-1) 可以看到,原码计算会出错, 补码计算,会成32+1 位, 33位,最高位,符号位会丢掉。 但是在计算的时候 实际上是参与运算了, 只是 int 定义为32位, 直接丢掉最高位, 这是c语言设计的哲学, 这样计算就没有问题。 但是在计算的时候,根本没有去思考,到底哪一位是数值位,哪一位是符号位,直接就算了。 这就是“ 将符号位和数值位进行统一”。
想想背后的设计者的 伟大!
原码和补码的相互转换,不需要额外的硬件电路。 >> 计算逻辑是一样的, 就是 取反 +1
数据在内存中到底是按照什么规则来存储的? 低到高 或者 高到低 这是两种 存储方式
这东西,记住就行。
怎么拿 起始地址? &a >> int * 类型 这就找到a &a取的是起始地址 *&a 就是取地址a,访问这个a,int * 是 四个字节 。
插入:
怎么进行强制类型转换,int转换成char:
这里使用了类型转换(char *)将int类型的指针ptr转换为char类型的指针char_ptr。
*&a 就是取地址a,访问这个a,int * 是 四个字节 。 *(char*)&a
强制类型转换为char * *
>> (char *)&a
就是拿第一个字节 因为 char * 是1字节。
&a : 整型指针解引用,访问的是4个字节, char* 强制类型转换, 就是1字节 *(char*)&a
这里还有一个强制类型转换,确实很6.
这里比较难理解其实,花了一下午时间去搞,中途还复习了二级指针。你最后看这个代码的呈现,确实很巧妙,用一个条件来表示想法,用if进行判断,太棒了这个程序,但是它背后却是一系列很复杂的思考。
第二种比较啰嗦的写法:
2023-11-20 更
小数和浮点数在内存中有可能无法完全保存,会有精度丢失的问题。以下仅为举例说明,具体看ipad有演算。
浮点数在内存中具体存储,SME, 规则如下:
32位 。 1 8 23
64位 。 1 。 11 。 52
这个规则也是记住就行,
代码举例: S >> E >> M 存储 最后写成16进制 注:还可以看到,不够的话,可以在有效值M 后 补0占位
这是小端存储