2-C语言中的数据类型
一.字节
字节是计算机中用于衡量和操作数据的基本单位
详细解释:
1.物理层面
计算机底层只能处理0和1(二进制),每个0或1被称为一个比特
最初,计算机设计者需要规定一次处理多少比特。一个字节就是一组固定数量的比特的集合。虽然历史上字节的大小有过变化,但自20世纪70年代以来,1个字节=8个比特已经成为绝对的标准
2.容量角度
字节是基本单位,可以用它来衡量数据量的大小
- 1字节可以存储1个英文字母
- 更大的单位如下:1KB = 1024字节;1MB = 1024KB;1GB = 1024MB;1TB = 1024GB
- 我们的文件大小、硬盘容量、内存大小,都是用字节及其衍生单位来衡量的
3.编码的角度
计算机如何用字节表示文字?通过编码
- ASCII编码:最早也是最著名的编码之一。它规定用1个字节(8位)来表示英文字符、数字和符号。 例如:字节01000001代表A,00110001代表数字1
- Unicode编码:为了容纳全球所有语言的字符,出现了Unicode。最常用的UTF-8是Unicode的一种实现方式,它用1到4个不等的字节来表示一个字符; 如,英文字符A仍然用1个字节表示:01000001 中文字符“中”则需要用3个字节表示:11100100 10111000 10101101
字节的重要性:
1.它是寻址的基础:计算机内存中的每一个字节都有一个唯一的“门牌号”(称为内存地址),CPU通过这个地址来准确地找到需要的数据
2.它是数据的原子:几乎所有的高级数据类型(如整数、浮点数、字符串)在内存中都是由一个或多个连续的字节组成的
2.它是标准化的结果:8位字节的确立,使得不同厂商的hardware和software之间能够互通有无,是现代计算机产业发展的基石
简单来说,字节就是计算机世界里那个不可或缺的“基本粒子”,是连接底层硬件(0和1)与上层应用(文字、图片、程序)的桥梁
二.C语言中的数据类型
1.整数类型
C语言通过不同的类型修饰符组合,提供了多种整数类型,其主要区别在于:取值范围和占用内存大小
通用语法: [修饰符] int [变量名]
其中int有时可以直接省略
1.基本整型 int
大小通常为4字节
取值范围为-2^31 ~ 2^31 - 1
示例 int count = 100;
2.短整型short(short int)和长整型long(long int)long long (long long int)
- short:大小通常为2字节 取值范围为-2^15 ~ 2 ^15 - 1 示例:short temperature = -10;
- long:在32位系统上通常为4字节,在Linux/Unix系统上通常为8字节(在64Windows上仍为4字节) 取值范围:4字节时同int;8字节时为-2^63 ~ 2^63 - 1 字面量后缀:建议使用L,如1000000L 示例:long big_number = 1234567890L;
- long long:大小通常为8字节(C99标准引入) 取值范围:与8字节的long相同 字面量后缀:使用LL 示例:long long huge_number = 9223372036854115807LL;
3.无符号整型(使用unsigned修饰)
只能表示零和正数,因此正数范围比对应的有符号类型大一倍
- unsigned int:大小:通常为4字节 取值范围:0 ~ 2^32 - 1 示例:unsigned int student_id = 4294967295;
- unsigned short:大小:通常为2字节 取值范围:0 ~ 2^16 - 1
- insigned long:大小:4或8字节 取值范围:4字节时0 ~ 2^32 - 1;8字节时0 ~ 2^64 - 1 示例:unsigned long file_size = 1024UL; 其中UL是一个字面量后缀,它用来明确告诉编译器,这个数字常量的类型是什么 U代表Unsigned(无符号),L代表Long(长整型) 为什么需要这样做:1.避免编译器警告和隐式转换。没有后缀时,如1024默认类型是int,当你把它赋值给一个unsigned long 变量时,编译器需要做一个隐式类型转换。这在大多数情况下没有问题,但在某些严格或需要精确定义的场景下,直接使用类型匹配的字面量是更好的实践 2.确保运算结果的正确性 注意:对于整数,小写l容易和数字1混淆,建议使用大写L
- unsigned long long :通常为8字节 取值范围:0 ~ 2^64 - 1
4.字符型char
char本质上1字节的整数,主要用于存储字符
1.char
大小:1字节
取值范围:取决于编译器,可能是sigend char 或者 unsigned char。通常默认为-128 ~ 127
示例:char c = 'A'; (存储的是ASCII值65)
2.signed char
明确指定为有符号
取值范围:-128 ~ 127
3.unsigned char
明确指定为无符号
取值范围: 0 ~ 255
用途:常用于处理原始二级制数据
三.sizeof的用法
sizeof是C语言中一个非常重要且独特的运算符(不是函数!),用于计算其操作数所占用的内存大小,单位是字节
基本语法:(两种使用形式)
1.sizeof(类型)
2.sizeof(表达式)或sizeof 变量名
具体用法与示例:
1.对数据类型使用(必须带括号)
#include <stdio.h>int main() {printf("Size of char: %zu bytes\n", sizeof(char));printf("Size of int: %zu bytes\n", sizeof(int));printf("Size of short: %zu bytes\n", sizeof(short));printf("Size of long: %zu bytes\n", sizeof(long));printf("Size of float: %zu bytes\n", sizeof(float));printf("Size of double: %zu bytes\n", sizeof(double));return 0;
}
其中%zu是C语言中函数族的一个格式说明符,专门用于格式化size_t类型的变量
- z是一个长度修饰符,它告诉
printf
:"后面要打印的是一个与size_t
类型大小相匹配的整数"。 u
:这是类型说明符,表示这是一个无符号十进制整数
所以,%zu
合起来的意思就是:"打印一个无符号的 size_t
类型的整数"
为什么 sizeof
的返回值要用 %zu
?
因为 sizeof
运算符的返回类型就是 size_t
。size_t
是一个在 <stddef.h>
、<stdio.h>
等标准头文件中定义的无符号整数类型,它的大小是平台相关的,足以表示该平台上任何对象的大小。
在 32 位系统上,
size_t
通常等价于unsigned int
(4 字节)。在 64 位系统上,
size_t
通常等价于unsigned long
(8 字节)。
使用 %zu
可以保证无论在什么平台上,都能正确、安全地打印出 size_t
的值。
2.对变量使用(括号可选)
可以直接对变量使用 sizeof
,这时括号是可选的,但加上括号是更常见的风格,可读性更好。
#include <stdio.h>int main() {int num = 10;double price = 20.5;char ch = 'A';// 以下两种方式都是正确的printf("Size of num: %zu bytes\n", sizeof(num)); // 推荐,带括号printf("Size of price: %zu bytes\n", sizeof price); // 不带括号printf("Size of ch: %zu bytes\n", sizeof(ch));return 0;
}