✏️ 本章所有提供代码均已测试,读万卷书不如行万里路,一定要把代码都自己敲一遍并测试
💬 如果这个世界真有奇迹,那也只是努力的另外一个名字,据说,每个降临到这个世界的人都自带粮草和地图,会迷途都是因为陷在眼前的一亩三分地,那些去看世界的人脚下一直有远方。
【在本篇文章中,你会学习到的内容如下】
1.数据在内存中的存储(二进制形式存储)
关于进制、原码反码补码、存储单位的具体,查看文章:https://blog.csdn.net/qq_62982856/article/details/126052638?spm=1001.2014.3001.5501
计算机要处理的信息是多种多样的,如数字、文字、符号、图形、音频、视频等,这些信息在人们的眼里是不同的。但对于计算机来说,它们在内存中都是一样的,都是以二进制
的形式来表示。
📍 存储单位的 bit 和 byte
1️⃣ bit(比特)
大名鼎鼎的比特币就是以此命名的。。
bit 是计算机内存中的最小单位(也称原子单位),它的简写为小写字母 “b
” 。
电脑是以二进制
存储以及发送接收数据的。二进制的一位,就叫做 1 bit。也就是说 bit 的含义就是二进制数中的一个数位,即 0
或者 1
。
2️⃣ byte(字节)
byte 是计算机系统中最小的存储单位,它的简写为大写字母 “B
"。
字节 Byte 和比特 bit 的换算关系是 1 Byte = 8 bit 。
存储单位
和网速
的单位,不管是 B 还是 b,代表的都是字节 Byte
。
带宽
的单位,不管是 B 还是 b,代表的都是比特 bit
。
2.基本数据类型简介
2.1 C语言数据类型参考
2.2 为什么需要数据类型
C语言为什么要引入这么多的数据类型呢?因为C语言归根结底只是一门编程语言,一种让计算机为我们做事情的工具。引入这么多的数据类型是为了更加方便的表现现实世界中事物。C语言提供的多种数据类型让程序更加灵活和高效,同时也增加了学习成本。
首先我们看数据类型在内存中的表示,我们知道0
和 1
作为信息的载体,数据都是以二进制的形式存放在内存中。二进制的数据本身是没有意义的,如果我们要使得二进制数据有意义,必须人为的加上数据类型。
📝 比如说(4个字节,32位):
00000000 00000001 00000000 00000001 • 1
如果没有数据类型,它只是数据,0和1是信息的载体,它们具体是什么含义,我们并不知道。当我们把类型加上以后,就很明显的知道了具体含义。
类型是对内存数据施加的约束:
- 约束一:要把要把几个字节或几个存储单元看成一个整体进行解析。
- 如果上述二进制我们用整型
int
类型来识别它,那我们把这四个字节作为一个整体进行解析。 - 如果我们用短整型
short
类型来识别它,我们把两个字节作为一个整体进行解析。 - 如果我们用字符型
char
类型来识别它,我们把一个字节作为一个整体进行解析。
- 约束二:是对二进制的解析方式不同。同样是4个字节,按照int和float类型解释得到完全不同的值。
- 约束三:类型约束了数据参与运算操作的集合,即我们的数据能够参与哪些运行,或者说类型告诉了编译器如何解释这个数值以及这个数值能够参与到哪些运算中。 比如说int类型的数据可以参与位运算,但如果你定义了一个数据的类型为double,该数据是不可以参与位运算的。
📍 由于类型的约束,使得计算机能够清晰的理解我们程序员的意图,就是说在我们编程的时候, 我们告诉了编译器此数据类型的数据采取什么样子的指令去参与运算,计算机就根据程序员所定义的类型来进行运算。数据类型用来说明数据的类型,确定了数据的解释方式,让计算机和程序员不会产生歧义。
💬 类型开辟内存空间的大小,大小决定了使用范围。
- Java、C++、C#等在定义变量时也必须指明数据类型,这样的编程语言称为强类型语言。
- 而PHP、JavaScript等在定义变量时不必指明数据类型,编译系统会自动推演,这样的编程语言称为弱类型语言。
那C语言是强类型还是弱类型语言呢?有人说强类型,也有人说是弱类型,其实争论这个本身没有意义。我们关注如何正确、安全的使用类型变量,避免隐式类型提升和转换才是正道。
3.整型
3.1 字节大小(长度)与取值范围
sizeof 操作符:用来获取某个数据类型或变量所占用的字节数。sizeof 是C语言中的操作符,不是函数。
📍 win64环境下的字节大小:
#include<stdio.h> int main() { printf("有符号短整型 short:%lld\n", sizeof(short)); printf("无符号短整型 unsigned short:%lld\n", sizeof(unsigned short)); printf("--------------------------------------------------\n"); printf("有符号整型 int:%lld\n", sizeof(int)); printf("无符号整型 unsigned int:%lld\n", sizeof(unsigned int)); printf("--------------------------------------------------\n"); printf("有符号长整型 long int:%lld\n", sizeof(long)); printf("无符号长整型 unsigned long int:%lld\n", sizeof(unsigned long)); printf("--------------------------------------------------\n"); printf("有符号长长整型 long long int:%lld\n", sizeof(long long)); printf("无符号长长整型 unsigned long long int:%lld\n", sizeof(unsigned long long)); return 0; }
📍 win32环境下的字节大小:
#include<stdio.h> int main() { printf("有符号短整型 short:%ld\n", sizeof(short)); printf("无符号短整型 unsigned short:%ld\n", sizeof(unsigned short)); printf("--------------------------------------------------\n"); printf("有符号整型 int:%ld\n", sizeof(int)); printf("无符号整型 unsigned int:%ld\n", sizeof(unsigned int)); printf("--------------------------------------------------\n"); printf("有符号长整型 long int:%ld\n", sizeof(long)); printf("无符号长整型 unsigned long int:%ld\n", sizeof(unsigned long)); printf("--------------------------------------------------\n"); printf("有符号长长整型 long long int:%ld\n", sizeof(long long)); printf("无符号长长整型 unsigned long long int:%ld\n", sizeof(unsigned long long)); return 0; }
这里就说明了在32 位环境以及 Win64 环境下整型数据类型的所占字节大小是相同的,但是在其它操作系统下计算出的字节大小就可能有所不同,因此使用的时候要注意移植性
。
🚩 总结(windows中)
数据类型 | 字节大小 | 取值范围 |
short | 2字节 | -32768~32767 |
unsigned short | 2字节 | 0~65535 |
int | 4字节 | -2147483648~2147483647 |
unsigned int | 4字节 | 0~4294967295 |
long | 4字节 | -2147483648~2147483647 |
unsigned long | 4字节 | 0~4294967295 |
long long | 8字节 | 9,223,372,036,854,775,808~9,223,372,036,854,775,807 |
unsigned long long | 8字节 | 0~18,446,744,073,709,551,616 |
unsigned 是无符号的意思,我们以 short 和 short int 来说明,short 就是有符号数,unsigned short 是 无符号数,但它们占的字节是相同的,则能表示的数的个数也是一致的,short 从 -32768~32767 一共 65536 个整数,unsigned 从 0 ~ 65535 不也是 65536 个整数吗
3.2 整型对应占位符
#include<stdio.h> int main() { short int a = -520; unsigned short int ua = 520; printf("有符号短整型 a = %hd\n", a); printf("无符号短整型 ua = %hu\n\n", ua); int b = -1314; unsigned int ub = 1314; printf("有符号整 型 b = %d\n", b); printf("无符号整 型 ub = %u\n\n", ub); long int c = -201314; unsigned long int uc = 201314; printf("有符号长整型 c = %ld\n", c); printf("无符号长整型 uc = %lu\n\n", uc); long long int d = -5201314; unsigned long long int ud = 5201314; printf("有符号长长整型 d = %lld\n", d); printf("无符号长长整型 ud = %llu\n", ud); return 0; }
🚩 总结
数据类型 | 占位符 |
short | %hd |
unsigned short | %hu |
int | %d |
unsigned int | %u |
long | %ld |
unsigned long | %lu |
long long | %lld |
unsigned long long | %llu |
4.浮点型
4.1 字节大小(长度)与取值范围
浮点数没有无符号数。
int main() { printf("单精度浮点数 float:%lld\n\n", sizeof(float)); printf("双精度浮点数 double:%lld\n\n", sizeof(double)); printf("长双精度浮点数 long double:%lld\n\n", sizeof(long double)); return 0; }
🚩 总结
数据类型 | 存储大小 | 值范围 | 精度 |
float | 4字节 | 1.2E-38 到 3.4E+38 | 6 位有效位 |
double | 8 字节 | 2.3E-308 到 1.7E+308 | 15 位有效位 |
long double | 16 字节 | 3.4E-4932 到 1.1E+4932 | 19 位有效位 |