24/06/25(4.1122)数据存储,自定义类型

重点:1.数据类型详细介绍

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

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

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

前面都有char short int...详细介绍,翻一翻.需要注意的是,C语言没有字符串类型哦.

计算机永远存储的都是补码,计算也是用补码进行的,只有在要输出的时候转化成原码.

    int a = -10;(正数的三个码一致哦)
    //1000 0000 0000 0000 0000 0000 0000 1010原
    //1111 1111 1111 1111 1111 1111 1111 0101反
    //1111 1111 1111 1111 1111 1111 1111 0110补
    //   F    F    F    F    F    F    F    C

大小端

大端:数据的低位保存在内存的高地址,数据的高位保存在内存的低地址

小段:数据的低位保存在内存的低地址,数据的高位保存在内存的高地址

网络字节序---大端


int main(){
    char a = -1;
    signed char b = -1;
    unsigned char c = -1;//1000 0001
                        //1111 1110
                        //1111 1111 FF
    printf("a = %d,b = %d,c = %d",a, b, c);

    return 0;
}

a = -1,b = -1,c = 255

int main(){
    char a = -128;
    //1000 0000
    //1000 0000 0000 0000 0000 0000 1000 0000
    //1111 1111 1111 1111 1111 1111 0111 1111
    //1111 1111 1111 1111 1111 1111 1000 0000
    //4294967168
    printf("%u\n",a);
    system("pause");
    return 0;
}

浮点数的存储

#include<stdio.h>

int main(){
    float f = 1.125;// (-1) ^ s * m * 2 ^ e ==> s = 0 m = 1.125 e = 0
    system("pause");
    return 0;
}

#include<stdio.h>

int main(){
    float f = 10.125;//1010.001  (-1)^s*m*2^e
    system("pause");//1.010001 (-1)^s*
    return 0;        //10.125
}                    //1010.001(小数化二进制的乘二取整法)0.125*2=0.25 -> 0;0.25*2=0.5->0;     0.5*2=1->1
                    //1.010001 *2^3
                    //(-1)^s*m*2^e  s=0 m=1.01001 e=3

按照 s(一位) e(八位) m(二十三位)的顺序写,其中m减去1只要小数点后面的,e加中间数127再转成二进制

e全为0时 指数e=1-127,有效数字m不再加上第一位的1,而是还原为0.xxxxxxxx的小数,无限接近于0;

e全为1,这时如梭有效数字m全为0,表示无穷大(正负取决于符号位)

#include<stdio.h>
#include<stdlib.h>

struct test{
    int a;
    double b;
    struct test t;
};

int main(){
    struct test tt;

    system("pause");
    return 0;
}

这样是不行的,结构体中调用这个结构体会造成无限递归.

但如果把结构体参数换成指针就可以.

#include<stdio.h>
#include<stdlib.h>

struct test{
    int a;
    double b;
    struct test *t;
};

int main(){
    struct test tt;

    system("pause");
    return 0;
}

结构体字节对齐

(1)各种数据类型需要按照一定的规则在空间上排列,而不是顺序的一个接一个排放,这就是对齐

它是一种时间换空间的策略.(可以空出一些空间减少访问次数)

//基本数据类型有一个对齐值,就是它自身的大小
//自定义类型有一个对齐值(内部当中最大的类型,比如下面的8)

struct test{
    int a;                //1 + 7
    double b;        //8从上往下看,开辟的空间要是下面的整数倍(现在就是16,4的4倍)
    struct test t;   //4 + 4
};

这就是24个字节;

(2)变量a b t的顺序也会影响

struct test{
    int a;         //1 + 3
    struct test t; //4
    double b;       //8从上往下看,开辟的空间要是下面的整数倍
    
};

这样就是16个字节

(第三中情况)要求他按照两个字节对齐,程序指定对齐值和程序有效对齐值就是2,这样就要求开辟空间是2的整数倍,而不是看最大的8了.

//基本数据类型有一个对齐值,就是它自身的大小
//自定义类型有一个对齐值(内部当中最大的类型,比如下面的8)
//程序指定对齐值
//程序有效对齐值

#pragma pack(2)
struct test{
    int a;         //1 + 1
    struct test t; //4
    double b;       //8
    
};

这样就是14个字节.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值