【C语言】 数据的存储 -- 数据类型介绍 -- 存储 -- 浮点型在内存中的存储,很详细也很重要,不明白的一定要看1

简介: 【C语言】 数据的存储 -- 数据类型介绍 -- 存储 -- 浮点型在内存中的存储,很详细也很重要,不明白的一定要看1

*************************************************正文开始*************************************************

1、数据类型介绍

前面我们已经学习了基本的内置类型(C语言已经有的类型叫做内置类型)
char         short         int         long         long long         float         double

以及他们所占存储空间的大小。

类型的意义:

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

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

1.1 类型的基本归类

整型家族:

char
  unsigned char
  signed char//char = signed char 是取决于编译器的
short
  unsigned short [int]//这里的int可以不写,下面一致 
  signed short[int]//short = signed short ,signed 可省略
int 
  unsigned int 
  signed int //int = signed int ,signed 可省略
long
  unsigned long [int]
  signed long [int]//long = signed long ,signed 可省略

注:


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


2.数值在分类的时候有正有负,因次就存在 unsigned(无符号,只有正),signed (有符号,可正可负),平时写的 int = signed int,signed可省略 。但是 char == signed char 是取决于编译器的(见到的编译器上大多是等于的)。


浮点型家族:

float
double

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

>数组类型  //int arr[5],char str[10]
>结构体类型 struct
>枚举类型 enum
>联合类型 union

指针类型:

int *pi;//+-1跳过几个字节看指针的类型,解引用访问几个字节也是看指针类型
char *pc;
float *pf;
void *pv;

空类型:

void 表示空类型(无类型)

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

函数不希望有任何返回值就用 void ;函数的参数写成 void 代表了这个函数不需要参数;void* p 是无具体类型的指针。

2、整型在内存中的存储

一个变量的创建是要在内存中开辟空间的。空间的大小是根据不同的类型而决定的。

那接下来我们他谈数据在所开辟的内存中到底是如何存储的?

比如:

int a = 20;
int b = -10;

我们知道为 a 分配四个字节的空间。

那如何存储?

下来了解下面的概念:

2.1 原码、反码、补码

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

三种表示方法均有符号位和数值位两部分,符号位都是用‘0’表示“正“,用‘1’表示”负“,而数值位只要把这个数字表示清楚就可以。
正数的原、反、补码都相同。

负整数的三种表示方法各不相同。

举例:

int main()
{
  int a = 20;
  //原码:00000000 00000000 00000000 00010100
  //反码:00000000 00000000 00000000 00010100
  //补码:00000000 00000000 00000000 00010100
  int b = -10;
  //原码:10000000 00000000 00000000 00001010
  //反码:11111111 11111111 11111111 11110101
  //补码:11111111 11111111 11111111 11110110
  return 0;
}


原码


直接将数值按照正负数的形式翻译成二进制就可以得到原码。


反码


将原码的符号位不变,其他位一次按位取反就可以得到反码。


补码


反码+1就得到补码。


对于整型来说:数据存放内存中其实存放的是补码。


我们为了更加清楚,使用调试可以观察一下内存中如何存储:


正数的原反补码相同说明不了问题,我们来看负数的


这里是为了方便展示所以用的 16进制,在内存中就是以 2进制存储的。2进制数转换为 16进制数就是 ff ff ff f6。


Q:为什么数据存放内存中其实存放的是补码呢?


A:在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;


同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互交换,其运算过程是相同的,不需要额外的硬件电路。


这段话有点难理解,我们举例来说明一下:


我们以 1 - 1 来说。上面的话说 CPU 只有加法器,而我们这里却是用减法处理的,因此我们改写为 1+(-1),而CPU就是这样来做的。

int main()
{
  1 + 1;
  1 + (-1);
  //1的补码: 00000000 00000000 00000000 00000001
  //-1的原码:10000000 00000000 00000000 00000001
  //-1的反码:11111111 11111111 11111111 11111110
  //-1的补码:11111111 11111111 11111111 11111111
  //1+(-1)补码相加:1 00000000 00000000 00000000 00000000
  return 0;
}

分析:



这也说明了内存中存储的是补码。

相关文章
|
17天前
|
存储 人工智能 程序员
一文彻底搞清楚C语言的数据类型和变量
本文介绍了数据类型(基本、构造、指针、空类型)、变量(使用、命名规则、作用域)和常量(字面、符号、枚举、表达式),帮助初学者理解编程基础概念。坚持学习,定能创造奇迹!
178 1
一文彻底搞清楚C语言的数据类型和变量
|
2月前
|
C语言
【C语言程序设计——入门】基本数据类型与表达式(头歌实践教学平台习题)【合集】
这份文档详细介绍了编程任务的多个关卡,涵盖C语言的基础知识和应用。主要内容包括: 1. **目录**:列出所有关卡,如`print函数操作`、`转义字符使用`、`数的向上取整`等。 2. **各关卡的任务描述**:明确每关的具体编程任务,例如使用`printf`函数输出特定字符串、实现向上取整功能等。 3. **相关知识**:提供完成任务所需的背景知识,如格式化输出、算术运算符、关系运算符等。 4. **编程要求**:给出具体的代码编写提示。 5. **测试说明**:包含预期输入输出,帮助验证程序正确性。 6. 文档通过逐步引导学习者掌握C语言的基本语法和常用函数,适合初学者练习编程技能。
85 1
|
3月前
|
存储 编译器 C语言
【C语言】数据类型全解析:编程效率提升的秘诀
在C语言中,合理选择和使用数据类型是编程的关键。通过深入理解基本数据类型和派生数据类型,掌握类型限定符和扩展技巧,可以编写出高效、稳定、可维护的代码。无论是在普通应用还是嵌入式系统中,数据类型的合理使用都能显著提升程序的性能和可靠性。
95 8
|
3月前
|
存储 程序员 编译器
C 语言中的数据类型转换:连接不同数据世界的桥梁
C语言中的数据类型转换是程序设计中不可或缺的一部分,它如同连接不同数据世界的桥梁,使得不同类型的变量之间能够互相传递和转换,确保了程序的灵活性与兼容性。通过强制类型转换或自动类型转换,C语言允许开发者在保证数据完整性的前提下,实现复杂的数据处理逻辑。
|
5月前
|
存储 C语言
【c语言】数据类型和变量
本文介绍了C语言中的数据类型和变量。数据类型分为内置类型和自定义类型,内置类型包括字符型、整型、浮点型等,每种类型有不同的内存大小和取值范围。变量分为全局变量和局部变量,它们在内存中的存储位置也有所不同,分别位于静态区和栈区。通过示例代码和图解,详细阐述了这些概念及其应用。
95 1
|
5月前
|
存储 C语言
初识C语言:常量与变量中寻找数据类型
初识C语言:常量与变量中寻找数据类型
|
5月前
|
存储 编译器 程序员
C语言数据类型详解
C语言数据类型详解
|
5月前
|
C语言
3.1C语言基本数据类型
在C语言中,初始化变量是指为变量设定初始值,通常在声明时直接完成,例如 `int cows=32;`。应注意避免在同一语句中混合初始化与未初始化的变量,如 `int dogs, cats=94;` 这样的写法容易引起误解。此外,整型常量如21、32等在C语言中被视为int类型,但非常大的整数则不然,且带有小数点或指数的数值不属于整型常量。
47 9
|
5月前
|
C语言
3.4 C语言基本数据类型2
在C语言中,声明一个整型(int)变量时,需先写入'int'关键字,后跟变量名并以分号结尾。若同时声明多个变量,可在'int'后用逗号分隔列出所有变量名。例如,`int erns;` 或 `int hogs, cows, goats;` 都是合法声明。变量声明后需通过赋值语句如 `cows = 112;` 或使用函数如 `scanf()` 来初始化其值。
87 10
|
5月前
|
存储 程序员 C语言
3.1 C语言基本数据类型
在C语言中,整数类型如`int`类型是很有用的,它属于有符号整型,意味着该类型的值必须是整数,并且可以是正整数、负整数或者零。`int`类型的数值范围依据计算机系统有所不同,通常取决于系统的位宽。例如,在早期16位的IBM PC兼容机上,`int`类型使用16位存储,取值范围为-32768至32767;而在当前32位系统中,使用32位存储,拥有更宽泛的取值范围。随着64位处理器的普及,`int`类型能够存储的整数范围将进一步扩大。根据ISO C标准,`int`类型的最小取值范围被规定为-32768到32767。系统通常会利用一个特殊的位来表示整数的正负。
97 10