深度剖析数据在内存中的存储

本文深入探讨了C语言中的数据类型,包括char、short、int、long、long long、float和double等,以及它们的有符号和无符号变体。此外,详细阐述了整数在内存中的存储方式,如原码、反码和补码,并介绍了大小端字节序的概念和判断方法。文章还通过实例展示了不同数据类型的内存表示和运算过程,帮助理解计算机内部如何存储和处理数据。
摘要由CSDN通过智能技术生成

本章重点:

  1. 数据类型详细介绍

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

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

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

1.数据类型介绍

char        //字符数据类型
short       //短整型
int         //整形
long        //长整型
long long   //更长的整形
float       //单精度浮点数
double      //双精度浮点数
//C语言有没有字符串类型?

类型的意义:

  1. 使用这个类型开辟空间的大小(大小决定了使用的范围)。

  2. 如何看内存空间的视角。

1.1 类型的基本归类:

整形家族:(char 虽然是字符类型,但是字符类型存储的时候,存储的字符是ascii码值,ascii值是整数)

char
    unsigned char
    signed char
//char c1;//char到底是有符号?还是无符号?-->不确定,是取决于编译器的实现。
//signed char c2;
//unsigned char c3;
        
short
    unsigned short [int]
    signed short [int]
//short s1;//有符号
//short 等价于 signed short
//signed short s2;//有符号
//unsigned short s3;//无符号的short
//有正负数据可以存放在有符号的变量中
//只有正数的数据可以存放在无符号的变量中
//int可省略     
    
int
    unsigned int
    signed int
//int n1;//n1就是有符号的,int等价于signed int
//signed int n2;
//unsigned int n3;
    
    
long
    unsigned long [int]
    signed long [int]
//long n = 0;long 等价于signed long 
//signed long n2 = 0;
//unsigned long n3;
​

浮点型家族:

float 
double
//long double

构造类型:(自定义类型)

>数组类型
//int arr[10];//arr的类型是:int [10]
//int arr2[4];//int [4]
//char arr3[4];//char [4]
//int a[]={0,0,0};//int [3]
>结构体类型 struct
>枚举类型 enum
>联合类型 union

指针类型:

int *pi;
char *pc;
float* pf;
void* pv;
//指针变量是用来存放地址!

空类型:

void 表示空类型(无类型)
通常应用于函数的返回类型、函数的参数、指针类型。

2.整形在内存中的存储

2.1 原码、反码、补码

计算机中的整数有三种表示方法,即原码、反码和补码。

三种表示方法均有符号位数值位两部分,符号位都是用0表示“正”,用1表示“负”

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//整数可以写出三种2进制表示形式:
//原码:直接将数值按照正负数的形式翻译成二进制就可以
//反码:将原码的符号位不变,其他位依次按位取反就可以得到了
//补码:将反码+1
//正整数的原码、反码、补码相同
//负数的原码、反码、补码是需要计算的
int main()
{
    int a = 10;//整型值
    //原码:00000000000000000000000000001010
    //反码:00000000000000000000000000001010
    //补码:00000000000000000000000000001010
​
    int b = -10;
    //原码:10000000000000000000000000001010
    //反码:11111111111111111111111111110101
    //补码:11111111111111111111111111110110
    //        F   F     F    F    F    F    F    6
    //0xff ff ff f6
    return 0;
 }
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
    1 - 1;
    //1+(-1);
    //CPU只有加法器
    //使用补码的二进制计算
    //00000000000000000000000000000001
    //10000000000000000000000000000001
    //11111111111111111111111111111111
//   100000000000000000000000000000000
    //0
    //10000000000000000000000000000001 -1的原码
    //11111111111111111111111111111110 -1的反码
    //11111111111111111111111111111111 -1的补码
    //
    //使用原码计算是错误的
​
    return 0;
}

正在上传…
取消

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
    unsigned int ch = -10;
    //-10
    //10000000000000000000000000001010
    //11111111111111111111111111110101
    //11111111111111111111111111110110
    //
    //printf("%u\n",ch);//%u是打印无符号数,意思是你要我打印的是无符号数,不是无符号数,我也认为是无符号数。
    //printf("%d\n",ch);//%d是打印有符号数,意思是你要我打印的是有符号数,不是有符号书,我也认为是有符号数。
    return 0;
}

2.2 大小端介绍

大小端字节序存储

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

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

百度2015年系统工程师笔试题:

请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。(10分)

int check_sys()
{
    int a=1;
    return *(char*)&a;
}
int main()
{
    int ret = check_sys();
    if(ret == 1)
    {
        printf("大端\n");
    }
    else
    {
        printf("小端\n");
    }
    return 0;
}

2.3 练习

1.
//输出什么?
#include <stdio.h>
int main()
{
    char a= -1;
    //100000000000000000000000000000001
    //111111111111111111111111111111110
    //111111111111111111111111111111111
    //
    //11111111
    //111111111111111111111111111111111
    //111111111111111111111111111111110
    //100000000000000000000000000000001
    //
    signed char b=-1;
    unsigned char c=-1;
    //100000000000000000000000000000001
    //111111111111111111111111111111110
    //111111111111111111111111111111111
    //11111111 -c
    //000000000000000000000000111111111
    //
    printf("a=%d,b=%d,c=%d",a,b,c);
    //-1 -1 255
    //当我们打印a的时候,要发生整型提升
    //打印的是有符号数
    return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值