c语言数据在内存中的储存方式

c语言数据在内存中的储存方式大揭秘

  1. 1.数据的类型详细介绍

  2. 2.整形在内存中的存储:原码,反码,补码

  3. 3.大小端字节序介绍及判断

  4. 4.浮点型在内存中的储存解析

    ​ 快速查阅

    [TOC]



数据的类型详细介绍:

  1. c语言中数据内型有
  • char //字符类型也是整型数据类型(字符以ASCLL码值形式储存在内存中)
  • 空类型 void
  • short int long longlong // 整形的数据内型
  • float double //浮点型的数据内型
  • bool (只适用于部分编辑器c99才引用,布尔类型作用是表示真假的变量) //其本质是对整型类型的 1和0的修饰·
  • 构造类型:数组类型,结构体类型,枚举类型,联合类型,指针类型;
//例如如下代码是该类型的简单应用
int main()
{
    _bool flag=true;
    if(flag)
    {
        flag=false;
    }
    if(flag)
    {
        printf("我是zhuzhuxia")}
    return 0;
}

很显然输出结果不能输出(我是zhuzhuxia)

  • 有符号数和无符号数的概念

    1. 符号表示:signed和unsinged

      • 例如unsigned int

        unsigned float…

        int==signed int

        float==signed float…

        注意

        char不一定等于signed char,这主要取决于不同的编辑器;

整形在内存中的存储:原码,反码,补码

  1. 整数的三种表现形式,原码,反码,补码;而内存中储存的是二进制的补码
  2. 正数的原码,反码,补码相同

负数的原码:按照一个数的正负写出来的二进制就是原码 ;反码:符号位不变,其他位按位取反补;补码:反码的二进制序列加一;

补充一点:4个比特位表示一位16位数字。及一个字节可由两个16进制数字表示

3.当用一个char类型的变量去储存一个整形数据时,整型数据字节会发生截断,如果输出时以无符号或有符号形式打印时,这时会发生整型提升,根据被截断数据的数据类型进行补全原码在进行打印

大小端字节序介绍及判断

《大小端的由来》

大端模式和小端模式的起源:关于大端小端名词的由来,有一个有趣的故事,来自于Jonathan Swift的《格利佛游记》:Lilliput和Blefuscu这两个强国在过去的36个月中一直在苦战。战争的原因:大家都知道,吃鸡蛋的时候,原始的方法是打破鸡蛋较大的一端,可以那时的皇帝的祖父由于小时侯吃鸡蛋,按这种方法把手指弄破了,因此他的父亲,就下令,命令所有的子民吃鸡蛋的时候,必须先打破鸡蛋较小的一端,违令者重罚。然后老百姓对此法令极为反感,期间发生了多次叛乱,其中一个皇帝因此送命,另一个丢了王位,产生叛乱的原因就是另一个国家Blefuscu的国王大臣煽动起来的,叛乱平息后,就逃到这个帝国避难。据估计,先后几次有11000余人情愿死也不肯去打破鸡蛋较小的端吃鸡蛋。这个其实讽刺当时英国和法国之间持续的冲突。Danny Cohen一位网络协议的开创者,第一次使用这两个术语指代字节顺序,后来就被大家广泛接受。

》为什么会有大小端序列储存方式

大小端问题主要涉及的是非单字节非字符串外的其余数据的表示和传递,如short型、int型等。大端和小端有其各自的优势。我们知道计算机正常的内存增长方式是从低到高(当然栈不是),取数据方式是从基址根据偏移找到他们的位置,从他们的存储方式可以看出,大端存储因为第一个字节就是高位,从而很容易知道它是正数还是负数,对于一些数值判断会很迅速。而小端存储 第一个字节是它的低位,符号位在最后一个字节,这样在做数值四则运算时从低位每次取出相应字节运算,最后直到高位,并且最终把符号位刷新,这样的运算方式会更高效。

  1. 大端字节序:当一个数的低字节序放在高地址处,高字节序放在低地址处时,这种存储方式称之为大端存储;
  2. 小端字节序:当一个数的低字节序放在低地址处,高字节序放在低高址处时,这种存储方式称之为小端存储;

浮点型在内存中的储存解析

  1. 任意一二进制浮点数v可以写成下面的形式

    • (-1)s乘m乘2E

    • (-1)^s代表符号位,当s==0时,v为正数,v当等于1时,v为负数

    • m代表有效数字,大于等于1,小于2

    • 2^E代表指数位

      注意:单精度与双精度浮点数的存储模型

      s E m在内存中是按照从低地址到高地址的顺序依次储存的

      • 单精度:对于32位的浮点数,s的储存空间大小只有1bit,E有8bit,M有23bit

      • 双精度:对于64位的浮点数,s的储存空间大小只有1bit,E有11bit,M有52bit

        2.关于,s E m的具体储存方式解析如下

        • s由一个比特位储存

        • 因为1<=m<=2,souyim可以写成1.xxxxx的形式,因为m的第一位都为1,所以储存时,只储存小数点后面的部分

        • E首先会被识别为一个为一个无符号整数,但实际上用科学计数法计数时E可为一个负数所以要对其进行处理,及加上一个中间数,如果E为8位,存入内存时这个中间数位127,如果E为11位,存入内存时这个中间数位1023,例如E==10且为8位时,存进内存的真实数据为10+127=137

你可能感兴趣的:(c语言)