天天看点

「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(这都是针对补码)
}
           
「C语言进阶」数据内存的存储

标题

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

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

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

继续阅读