「C语言进阶」数据内存的存储

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

 

目录

🐰数据类型的介绍

🐰类型的意义

🐰数据类型的基本归类

🌸整形家族:

🌸浮点型家族:

🌸构造类型:

🐰整形在内存中的存储

🐰大小端

🐰关于有无符号字符类型和整形提升的经典题型


🐰数据类型的介绍

内置类型:

char        字符型        1字节

short       短整形        2字节

int            整形            4字节

long         长整形        8字节

long long更长整形     8字节

float         单精度浮点型        4字节

double     双精度浮点型        8字节

🐰类型的意义

1.使用这个类型开辟内存空间的大小

2.如何看待内存的视角

🐰数据类型的基本归类

🌸整形家族:

字符存储和表示的时候本质上使用的是ASCII值,ASCII值是整数,字符类型也归类到整形家族

char:

    unsigned char
    signed char

C语言并没有规定char就是 unsigned char,取决于编译器(一般char就是 unsigned char)

short:

    unsigned short [int](int可以省略)
    signed short [int](int可以省略)

int :

 

   unsigned int 
    signed int 

long :

  unsigned long[int](int可以省略)
    signed long[int](int可以省略)

 

🌸浮点型家族:

float

double

以后会详细解读浮点型

🌸构造类型:

数组类型

int arr[10]的类型int [10],因此数组类型很多,又称自定义类型

结构体类型

struct 关键字

枚举类型

enum 关键字

联合类型

unio 关键字

指针类型

int* pi
char* pc
float* pf
void* pv

*空类型

void表示空类型,通常用于函数的返回类型、函数参数、指针类型

🐰整形在内存中的存储

一个变量的创建是需要开辟一段空间

原码,反码,补码

整数的二进制有三种表示形式:原码,反码,补码

三种表示形式都有符号位和数值位,符号位用0表示“正”,1表示“负”,而数值位正数的原、反、补都相同,

负数的原码,负数的反码就是在原码基础上符号位不变,数值位按位取反,负数反码+1就是补码

int a=20

00000000000000000000000000010100原码

00000000000000000000000000010100反码

00000000000000000000000000010100补码

int b=-20

10000000000000000000000000010100原码

111111111111111111111111111111111111101011反码

111111111111111111111111111111111111101100补码

注:对于整形来说:数据存放在内存中的其实是补码
int a=1;
补码:00000000000000000000000000000001
int b=-1;
原码:10000000000000000000000000000001
反码:1111111111111111111111111111111111111111110
补码:1111111111111111111111111111111111111111111
int c=a+b
c的补码: 1 00000000000000000000000000000000(这里是33位,但是只能存储32位,所以高位1,丢弃)
则c的补码:00000000000000000000000000000000
所以c的原码:00000000000000000000000000000000

🐰大小端

含义:

大端字节序:把一个数据的低字节的数据,存放在高地址处,把高字节的数据,存放在低地址

小端字节序:把一个数据的低字节的数据,存放在低地址处,把高字节的数据,存放在高地址

百度2015年工程师测试题

设计一个函数去判断大小端

#include<stdio.h>
int check_sys()
{
    int a=0x01223302;
    return *(char*)&a;
}
int main()
{
    if(check_sys()==2)
    {
        printf("小端\n");
    }
    else
    {
        printf("大端\n");
    }
}

🐰关于有无符号字符类型和整形提升的经典题型

int main()
{
    char a=-1;
    -1:原码:10000000000000000000000000000001
                 反码 :11111111111111111111111111111110
                 补码 :11111111111111111111111111111111
    a:发生截断
       补码:11111111
    signed char b=-1;
    unsigned char c=-1;  
       c:发生截断
       补码:11111111(这里的最高位不是符号位)
    printf(“a=%d b=%d c=%d”,a,b,c);
    a:发生整形提升
       原来的补码:11111111
       现在的补码:11111111111111111111111111111111
       现在的反码:11111111111111111111111111111110
       现在的原码:10000000000000000000000000000001
    所以a的值为-1
    c:发生整形提升
       原来的补码:11111111
       现在的补码:00000000000000000000000011111111
       现在的原码:00000000000000000000000011111111
    所以c的值为255
注意:这里的a与b是一样的,如果发生整形提升的时候,如果是有符号数,高位补符号位,如果是无符号数,高位补0(这都是针对补码)
}
字符类型变量取值范围(补码)
标题

 有符号char类型变量的取值范围:-128(补码10000000)~127

无符号char类型变量的取值范围:0~255

 🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸    

  • 20
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值