C语言 - 深度剖析数据的存储 上

简介: C语言 - 深度剖析数据的存储

文章目录

一、数据类型详细介绍

1、内置类型

内置类型就是C语言中自带的数据类型。在之前的学习中也有一定的了解:

char

short

int

long

long long

float

double

2、类型的意义

  • 1、使用这个类型开辟内存空间的大小(大小决定了使用范围)
  • 2、如何看待内存空间的视角

3、类型的归类

1、整型家族

2、浮点型家族

3、构造类型(自定义类型)

数组也是一种自定义类型,数组去掉数组名就是类型

int main()
{
  int arr[10];//int [10]
  int arr[5];//int [5]
  return 0;
}

4、指针类型

5、空类型

void表示空类型(无类型)

通常应用于函数的返回类型、函数的参数、指针类型

二、整型在内存中的存储

1、原码、反码、补码

数据在内存中是以二进制的形式进行存储的。对于整数来说,整数的二进制有3种表示形式:原码、反码、补码

对于正负整数来说有符号位之分:如果为正,高位为0;如果为负,高位为1

正整数:原码、反码、补码相同

---------------------------------------------------------分割-----------------------------------------------------------------------

负整数:原码、反码、补码之间的转换是需要计算的

原码:根据数值直接写出它的二进制序列

反码:原码的符号位不变,其它位按位取反

补码:反码+1

注意:整数在内存中存储的是补码,而打印出来给人看到的是原码

2、为什么在内存中是以补码的形式进行存储的

CPU只有加法器,只可以做加法运算,减法等运算都是用加法去模拟的

官方来说:在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器),此外,补码和原码相互转换,其运算过程是相同的,不需要额外的硬件电路

验证补码在内存中存储并计算:

1 - 1 -> 1 + (-1):

--------------------------------------使用原码进行计算-------------------------------------

--------------------------------------使用补码进行计算-------------------------------------

3、-10的存储

这里有一个点就是在当前编译器下-10在内存中是倒着存储的

三、大小端字节序

这里将会解答倒着存储的问题

1、什么是大端小端

大端(存储)模式,是指将数据的高字节内容放到内存的低地址处。而数据的低字节内容放到内存的高地址处

小端(存储)模式,是指将数据的高字节内容放到内存的高地址处。而数据的低字节内容放到内存的低地址处

2、为什么会有大端小端

这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着1个字节,1个字节为8bit。但是在C语言中除了8bit的char之外,还有16bit的short型,32bit的long型、int型(要看具体编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

3、实例

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

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

概念就不说了,上面有的

#include<stdio.h>
int check_sys()
{
  int a = 1;
  char* p = (char*) &a;
  return *p;//返回1表示小端,返回0表示大端
}
int main()
{
  int ret = check_sys();
  if(1 == ret)
    printf("小端\n");
  else
    printf("大端\n"); 
  return 0;
}

2、输出什么?

#include<stdio.h>
int main()
{
  char a = -1;
  signed char b = -1;
  unsigned char c = -1;
  printf("a=%d, b=%d, c=%d",a, b, c);
  return 0;
}

结果:

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

分析:

-----------------------------------a-----------------------------------

-----------------------------------b-----------------------------------

同a

-----------------------------------c-----------------------------------

-----------------------------------------分割线--------------------------------------------------------------------------

补充:

1、char是signed char还是unsigned char。C语言并没有规定,取决于编译器(大多数编译器下是signed char)

2、int、short是signed是C语言规定的

3、输出什么?

#include<stdio.h>
int main()
{
  char a = -128;
  printf("%u\n", a);
  return 0;
}

结果:

4294967168

分析:

4、输出什么?

#include<stdio.h>
int main()
{
  char a = 128;
  printf("%u\n", a);
  return 0;
}

结果:

4294967168

分析:


相关文章
|
20天前
|
存储 程序员 编译器
C 语言中的数据类型转换:连接不同数据世界的桥梁
C语言中的数据类型转换是程序设计中不可或缺的一部分,它如同连接不同数据世界的桥梁,使得不同类型的变量之间能够互相传递和转换,确保了程序的灵活性与兼容性。通过强制类型转换或自动类型转换,C语言允许开发者在保证数据完整性的前提下,实现复杂的数据处理逻辑。
|
21天前
|
存储 数据管理 C语言
C 语言中的文件操作:数据持久化的关键桥梁
C语言中的文件操作是实现数据持久化的重要手段,通过 fopen、fclose、fread、fwrite 等函数,可以实现对文件的创建、读写和关闭,构建程序与外部数据存储之间的桥梁。
|
24天前
|
存储 数据建模 程序员
C 语言结构体 —— 数据封装的利器
C语言结构体是一种用户自定义的数据类型,用于将不同类型的数据组合在一起,形成一个整体。它支持数据封装,便于管理和传递复杂数据,是程序设计中的重要工具。
|
1月前
|
存储 编译器 数据处理
C 语言结构体与位域:高效数据组织与内存优化
C语言中的结构体与位域是实现高效数据组织和内存优化的重要工具。结构体允许将不同类型的数据组合成一个整体,而位域则进一步允许对结构体成员的位进行精细控制,以节省内存空间。两者结合使用,可在嵌入式系统等资源受限环境中发挥巨大作用。
57 11
|
3月前
|
存储 编译器 C语言
C语言存储类详解
在 C 语言中,存储类定义了变量的生命周期、作用域和可见性。主要包括:`auto`(默认存储类,块级作用域),`register`(建议存储在寄存器中,作用域同 `auto`,不可取地址),`static`(生命周期贯穿整个程序,局部静态变量在函数间保持值,全局静态变量限于本文件),`extern`(声明变量在其他文件中定义,允许跨文件访问)。此外,`typedef` 用于定义新数据类型名称,提升代码可读性。 示例代码展示了不同存储类变量的使用方式,通过两次调用 `function()` 函数,观察静态变量 `b` 的变化。合理选择存储类可以优化程序性能和内存使用。
163 82
|
2月前
|
存储 C语言 C++
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
深入C语言,发现多样的数据之枚举和联合体
|
2月前
|
存储 C语言
C语言中的浮点数存储:深入探讨
C语言中的浮点数存储:深入探讨
|
2月前
|
存储 C语言
深入C语言内存:数据在内存中的存储
深入C语言内存:数据在内存中的存储
|
2月前
|
C语言
回溯入门题,数据所有排列方式(c语言)
回溯入门题,数据所有排列方式(c语言)
|
3月前
|
存储 人工智能 C语言
数据结构基础详解(C语言): 栈的括号匹配(实战)与栈的表达式求值&&特殊矩阵的压缩存储
本文首先介绍了栈的应用之一——括号匹配,利用栈的特性实现左右括号的匹配检测。接着详细描述了南京理工大学的一道编程题,要求判断输入字符串中的括号是否正确匹配,并给出了完整的代码示例。此外,还探讨了栈在表达式求值中的应用,包括中缀、后缀和前缀表达式的转换与计算方法。最后,文章介绍了矩阵的压缩存储技术,涵盖对称矩阵、三角矩阵及稀疏矩阵的不同压缩存储策略,提高存储效率。
479 8