数据在内存中的存储

数据在内存中的存储

一. C语言中的数据类型
(1) 存整数的: char, short, int, long, long long, int*, int[2].
(2) 存浮点数数的: float, double, float[2].
(3) 结构体.
二. 整数在内存中的存储
整数在内存中的存储涉及两个方面,一方面是字节序,第二个方面是补码.

  1. 字节序
    int num = 0X11223344
    在内存中如果按照44 33 22 11这种方式来存数据就是小端字节序,按照11 22 33 44 这样的方式来存数据就是大端字节序.
    (1) 有一个简便的记法:
    <1> 大端序
    如果平时吃鸡蛋就是从大头磕的话,符合直觉的排列方式就是你磕鸡蛋的方式
    <2> 小小小
    小端字节序,就是把低位(小)放在低地址(小)上
    注:Intel的CPU主要都是小端,尤其是咱们用的PC
    (2) 网络传输问题也涉及大端小端
    网络传输也是一个字节一个字节的传输,按照大端还是小端这个是提前约定好的,一般是固定大端字节序传输.
    (3)写一个简单的程序判断当前机器的字节序
    <1> 首先得先把变量的地址取出来(编号最小的地址),如果咱们就只是把这个地址对应的这一个字节读取出来,判断它是0X11还是0X44就可以了,是0X11就是大端序,是0X44就是小端序.
    <2> 想要取出一个字节,就要把int* 强制转换成为char* (这个指针之间的强制类型转换,不影响指针内部存储的地址值,只影响后续解引用代码对这个地址内存的长度的理解.
int isBigEnd(){
   int num = 0X11223344;
   int* p = &num;
   char* p2 = (char*)p;
   if(*p2 == 0X11){
   return 1;
   }
   return 0;
}
  1. 补码
    表示负数的时候用补码,正数不涉及补码,只是负数涉及(也就是说正数的补码是他自己本身)
    (1) 原码: 在正数的二进制基础上,把符号位设为1;
    反码: 符号位不变,其他位都取反;
    补码: 反码加1;
    (2)让计算机可以统一加法和减法:
    <1> 计算机计算两个数字相加,是靠一个硬件设备"加法器",而减法补码就可以实现.
    eg: 10+(-3)
    10 的原码: 0000 0000 0000 0000 0000 0000 0000 1010
    -3 的原码: 1000 0000 0000 0000 0000 0000 0000 0011
    -3 的反码: 1111 1111 1111 1111 1111 1111 1111 1100
    -3 的补码: 1111 1111 1111 1111 1111 1111 1111 1101
    用-3的补码加上10的原码就是10+(-3)的结果:
    0000 0000 0000 0000 0000 0000 0000 0111 (7)
    注:原码=>补码 取反+1; 补码=>原码 取反+1;
    <2> 乘法的本质就是连续相加;除法的本质就是连续相减,看能减几次,这实际上都能用加法来解决;而小数的加减乘除运算复杂,程序效率很低.
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值