基本类型数据(重点)
整形数据
整型变量的定义与内存查询
定义整形变量时,编译器会分配对应大小的内存空间,变量名作为该空间的标识,通过变量名可访问空间中的数据。
若不确定编译器分配的内存大小,可通过sizeof运算符查询(sizeof返回值的类型为size_t,也就是unsigned long int的别名,通常用%ld格式化输出)
int a = 10;
//输出:4,4 int类型占4字节,变量a使用int修饰,占4字节 sizeof返回的是size_t类型的字节数
printf("%ld,%ld\\n",sizeof(int), sizeof(a));
整形数据在内存中的存储形式
- 存储本质:数据在内存中是以二进制形式存储,最终以补码形式存放 。
- 补码的使用:统一加减法运算,使CPU可通过同一套加法电路(简化硬件设计)处理所有整数运算(包括正数、负数),同时消除了+0和-0歧义,只保留一个0。
关键概念
-
程序中的数据转换为二进制后,默认是原码形式。
-
正数的原码、反码、补码完全相同(三码一致)。
-
负数的补码计算:先取该数绝对值的原码 → 按位取反(得到反码) → 加 1(得到补码)。
内存数据的读写流程:
① 存数据:正数直接以补码存储;负数需经过 原码 → (按位取反) → 反码 → (+1) → 补码转换后存储。
② 取数据:正数补码直接还原为原码;负数需经过补码 → (-1) → 反码 → (按位取反) → 原码后还原(八进制/十进制/十六进制)
示例:整型变量的定义与运算
#include <stdio.h>
int main(int argc,char *argv[])
{
// 有符号整型变量:可存放正数、0、负数,默认类型(等价于signed int)
int a, b, c, d;
// 无符号整型变量:仅可存储正数、0、不能存储负数,需加unsigned关键字
unsigned int u, v;
// 赋值
a = 12;
b = –24;
u = 10;
c = a + u; // 12 + 10 = 22
d = b + u; // -24 + 10 = -14
v = –100;
printf("a+u=%d,b+u=%d,v=%u\\n", c, d, v);// %d:有符号int, %u:无符号int,v不接受负数,所以获取到的是随机值
return 0;
}
运行结果
a+u=22,b+u=–14,v=4294967196
补充:有符号与无符号char的存储范围对比(以 8 位为例):
- 有符号char:范围-128 ~ 127(最高位为符号位,0 表示正数,1 表示负数);
- 无符号char:范围0 ~ 255(所有位均为数据位,无符号位)。
浮点型数据
**定义:**用于存储实数(小数)的数据类型,支持整数部分和小数部分的表示。
浮点型变量的分类
| 单精度型 | float | 4 字节 | 6~7 位 | %f | 需在常量后加F/f(例:12.25f) |
| 双精度型 | double | 8 字节 | 15~16 位 | %lf(或%f,printf 通用) | 默认浮点型常量为double(例:12.5) |
| 长双精度型 | long double | 16 字节(Linux GCC) | 18~19 位 | %Lf | 精度最高,兼容性依赖编译器 |
注意:占用内存越大,精度越高,能表示的数值范围也越广。
float f1 = 12.25f; // 12.25f表示float类型的常量,推荐加F,语法上允许省略f/F,但会触发double->float的隐式转换
double f2 = 12.5; // 12.5表示double类型的常量,默认
long double f3 = 3.1415926535Lf; // 3.1415926535Lf表示long double类型的常量,建议少用,加Lf
浮点型数据在内存中的存储形式
浮点型数据按IEEE 754标准以二进制指数形式存储,系统将浮点型数据拆分为三部分分别存放:
举例:1234.51234.51234.5的指数形式为1.2345∗1031.2345 * 10^31.2345∗103(或1.2345e31.2345e31.2345e3)
IEEE 754标准相关参数:
| 单精度浮点数 | 4 | 1 位 [31] | 8 位 [30~23] | 23 位 [22~00] | 127 |
| 双精度浮点数 | 8 | 1 位 [63] | 11 位 [62~52] | 52 位 [51~00] | 1023 |
示例:27.5f 在内存中的存储形式
- **需求:**分析单精度浮点型数27.5f的内存存储二进制形式。
- 解析步骤:
- 转换为二进制:27.5的二进制为11011.1(整数部分27→1101127 → 1101127→11011,小数部分 0.5→10.5 → 10.5→1)
- 标准化指数形式:11011.1=1.10111∗2411011.1 = 1.10111 * 2^411011.1=1.10111∗24(小数点左移4位,指数为4)
- 计算指数位:指数(4) + 偏移量(127) = 131,转换为8位二进制1000 0011
- 处理尾数位:尾数部分为10111,(隐含整数部分 1),补0 → 1011 1000 0000 0000 0000 000
- 组合结果:符号位(0-正数) + 指数位(10000011) + 尾数位(10111000000000000000000)
补充:浮点型数据转二进制方法:
① 整数部分:辗转除以 2,取余数,逆序排列(直到商为 0);
② 小数部分:辗转乘以 2,取整数位,顺序排列(直到小数部分为 0 或达到尾数位长度,乘不尽时按精度截断)。
科学计数法(指数形式)规则
C 语言中浮点数的两种表示形式:
-
十进制形式:需包含整数部分或小数部分至少其一(例:10.0 、3.14 、.14 、10. 均合法;仅“.”不合法)
-
指数形式(科学计数法):用e或E
表示 10 的幂次,规则如下:
- e/E前面必须有数字(例:3.14e3合法,e3非法);
- e/E后面必须是整数(可正可负,例:3.1e-2合法,3.1e5.6非法);
- 示例:-3.14E-2(等价于-3.14×10⁻²)、2E-3(等价于2×10⁻³)、0.3E4(等价于0.3×10⁴)。
// 以指数形式输出浮点数,%e为指数形式格式化符号
printf("%e\\n", 10000000.00); // 输出:1.000000e+07
字符型数据
**概念:**字符型变量用于存储单个字符常量(查看ASCII字符集)
定义格式:
char 变量列表;
基础示例
char a = 'A'; // 赋值字符常量(单引号括起)
char b = a; // 赋值字符变量
示例:字符型常量的输出形式
#include <stdio.h>
int main(int argc,char *argv[])
{
char c1,c2;
c1 = 'A'; // 赋值字符常量
c2 = 66; // 赋值字符常量对应的ASCII码
// %c:以字符形式输出(将ASCII码转换为对应字符)
printf("c1=%c\\n", c1); // c1=A
printf("c2=%c\\n", c2); // c2=B
// %d:以整数形式输出(直接输出ASCII码值)
printf("c1=%d\\n", c1); // c1=65(A 的 ASCII码是 65)
printf("c2=%d\\n", c2); // c2=66(B 的 ASCII码是 66)
return 0;
}
注意:如果给char赋值整数,需要考虑赋值的整数范围,因为标准ASCII的范围是0~127
核心说明:
- 字符变量仅能存放单个字符(ASCII 字符),汉字、中文符号等占多字节的字符无法存放;
- C 编译器为字符变量分配 1 字节内存(1 字节 = 1 个 ASCII 字符);
- 字符常量存储本质:存入字符对应的 ASCII 码值(而非字符本身),因此字符型数据与整型数据可通用。
字符数据在内存中的存储形式
将字符常量存入字符变量时,实际存储的是该字符的 ASCII 码值(二进制形式)。
范例:char c1 = 'a', c2 = 'b';
- 'a'的 ASCII 码为 97,'b'的 ASCII 码为 98;
- 内存中以二进制形式存储:
字符型与整型的通用性
因字符数据本质是 ASCII 码(整数),故字符型与整型可通用:
- 字符型变量可赋值为整数(ASCII 码值),也可赋值为字符;
- 字符数据可参与算术运算(本质是 ASCII 码的运算);
- 输出形式灵活:%c以字符形式输出,%d以整数形式输出。
说明:有符号char的取值范围为-128~127,若赋值超出范围(如128)会发生溢出(属于未定义行为);主流编译器通常按“模256循环”处理(128对应-128,129对应-127),但结果不具备跨编译器兼容性。
示例:大小写字母转换(利用ASCII码运算)
-
原理:ASCII中,大写字母对应相应的小写字母相差32(例如:‘A’ = 65, ‘a’ = 97)
-
转换规则:
- 大写转小写:大写字母 + 32 = 小写字母
- 小写转大写:小写字母 – 32 = 大写字母
-
代码:
#include <stdio.h>
int main(int argc,char *argv[])
{char c1, c2;
c1 = 'm'; // 小写转大写
c2 = 'Y'; // 大写转小写printf("转换前:%c,%c\\n", c1, c2); // 输出:m,Y
// 转换
c1 = c1 – 32; // 将原本c1的值 – 32,一个char在参与数学计算的时候,会自动转换为int
c2 = c2 + 32;printf("转换后:%c,%c\\n", c1, c2); // 输出:M,y
return 0;
}
网硕互联帮助中心



评论前必须登录!
注册