目录
整型数据
用来存放整型数据的变量
定义整型变量,C语言编译系统在内存内分配了一个存储整型数据的存储空间。用变量名标识。通过变量名访问该空间。
通过sizeof查询分配的存储空间的大小,如:
int a = 10;
printf("%d,%d\n",sizeof(int),sizeof(a));
//sizeof返回的大小是以字节为单位,返回类型long unsigned
整型数据在内存中的存储形式
-
数据在内存中是以二进制形式补码存放
short i; //定义i为一个存储整型的变量 2字节
i = 10;
printf("%d\n",i);
则十进制数10的二进制数形式为1010,整数10在内存中的实际存储形式
为:

-
实际上:整型数据在内存中是以补码的形式表示,为了统一加减法运算
-
程序中的数据直接转换出来的二进制是原码形式
-
正数的补码和原码相同,三码唯一
-
负数的补码是将该数绝对值的二进制形式,针对数据位按位取反+1(反码+1为补码)
-

内存数据的读写:
① 向内存存数据(二进制形式):程序原始数据 → 二进制原码 → 二进制反码 → 二进制补码
② 从内存取数据(二进制形式):二进制补码 → 二进制反码 → 二进制原码 → 程序原始数据
案例
需求:整型变量的定义和使用
/*************************************************************************
> File Name: demo03.c
> Author: 三道渊
> Description:
> Created Time: 2025年07月09日 星期三 14时54分57秒
************************************************************************/
#include <stdio.h>
int main(int argc,char *argv[])
{
// 定义有符号整型变量,可以存放正数、0、负数,默认就是有符号数
int a,b,c,d; // 等价于 signed int a,b,c,d;
// 定义无符号整型变量,可以存放正数、0,不能存放负数,必须添加关键 unsigned
unsigned int u;
// 赋值
a = 12;
b = -24;
u = 10;
c = a + u, d = b + u;
printf("a+u=%d,b+u=%d\n",c,d); // a+u=22,b+u=-14
// 注意:计算机硬件支持加法运算,不支持减法运算,我们程序中的减法运算,实际上是有负数参与的加法运算,比如5-2实际上5+(-2)
return 0;
}
有符号和无符号数在内存中的存储形式(以char类型举例):

有符号char的范围:-128 ~127
无符号char的范围:0 ~ 255
浮点型数据
定义:用来表达实数(小数)的数据类型。
浮点型变量的分类
-
单精度浮点型(float):在64位系统中尺寸是4字节,精确到小数位6位,格式化符号 %f
-
双精度浮点型(double):在64位系统中尺寸是8字节,精确到小数位15~16位,格式化符号 %lf
-
长双精度浮点型(long double):在Linux下64位尺寸是16字节。
注意:占用内存越多,能表示的精确度越高。
float f1 = 12.25f; // 单精度
double f2 = 12.5; // 双精度
long double f3; // 长双精度
浮点型数据在内存中的存储形式
浮点型数据在内存中按照指数形式(IEEE 754标准)存放。系统将一个浮点型数分成尾数部分和指数部分,分别存放。
举例:
1234.5 → 1.2345*10^3 → 1.2345e3
| 类别 | 字节数 | 符号位 | 指数位(指数部分) | 尾数位(小数部分) | 指数偏移量 |
|---|---|---|---|---|---|
| 单精度浮点数 | 4 | 1位[31] | 8位[30~23] | 23位[22~00] | 127 |
| 双精度浮点数 | 8 | 1位[63] | 11位[62~52] | 52位[51~00] | 1023 |
float内存示意图:

案例
-
需求:写出27.5f在内存中的存放形式
-
解析:
-
27.5f的二进制为11011.1
-
转换为指数形式:11011.1 → 1.10111*2^4
-
指数:4 + 127 = 131,转换为二进制:
1000 0011 -
尾数:10111,需要补够23位,右侧补0:
1011 1000 0000 0000 0000 000浮点型数据如何转二进制?
① 整数部分:采用辗转除2直到出现小数为止。
② 小数部分:采用辗转乘2直到整数位出现1,小数位出现0为止,但是有时候会出现乘不尽的情况,此时需根据内存大小来决定保留位数。
-
用二进制表示就是符号位(1位)、指数位(8位)、尾数位(23位),最终显示:
-

※ 科学计数法(指数法):
C语言中一般浮点数有两种表示形式:
十进制形式:指的是数字必须以整数形式+小数形式组成,比如 10.0 、3.14 ......符合规则,以10为底数,并且科学计数法要在范围值之内。
指数形式(科学记数法):一般数学上对于小数可以以10为底进行表示 比如3.14 * 10²,但是在使用英文半角输入法的时候没办法输入上底或者下底,所以C语言规定以字母e或者E来表示指数,并且要求字母e或者E的前面必须有数字,字母e或者E的后面必须为整数。 -3.14E-2 2E-3 0.3E4
printf("%e", 10000000.00);所以:E3 错误 因为E的前面有数据 比如说 3.14E3
3.1e5.6 错误 因为 E的后面必须是整数
3.1e-2 对的 相当于 3.1 * 10^{-2}
1.01e-5 等价于 1.01*10^{-5}
字符型数据
概念:字符型变量用来存放字符常量。
定义:
char 变量列表;
举例:
char a = 'A';
char b = a;
举例:
/*************************************************************************
> File Name: demo04.c
> Author: 三道渊
> Description:
> Created Time: 2025年07月09日 星期三 16时43分02秒
************************************************************************/
#include <stdio.h>
int main(int argc,char *argv[])
{
char c1,c2;
c1 = 'A';
c2 = 'B';
printf("c1=%c\n",c1);// A %c是字符的格式化符号
printf("c1=%c\n",c2);
printf("c1=%d\n",c1);
printf("c2=%d\n",c2);
return 0;
}
运行结果:
说明:
一个字符变量只能存放一个字符。C编译系统规定以一个字节的存储空间来存放一个字符,因此,一个字符变量在内存中的大小是1个字节(1字节 = 1字符)
字符数据在内存中的存储形式
将一个字符常量存入一个字符变量,实际上并不是把该字符本身存入内存中,而是将该字符对应的ASCII(系统内置)码存入内存单元。
范例:
-
需求:
char c1 = 'a', c2 = 'b'; -
分析:
-
'a'的ASCII为97,'b'的ASCII码为98,它们在内存中的存储形式:
进一步理解,实际上是按照ASCII码的二进制形式存放,形式为:

-
由此可见,在内存中字符数据的存储形式与整型数据类似,这就使得字符型数据和整型数据之间可以通用,也就是1个字符数据既可以以字符形式输出,也可以以整数形式输出。
-
以字符形式输出时,编译系统将内存单元中的ASCII码转换为相应的字符,然后输出。
-
以整型输出时,直接将ASCII码作为整数输出。
-
因此,可以对字符数据进行算数运算,这时相当于对其ASCII码进行算数运算。
案例
-
要求:给字符变量赋整数值
/************************************************************************* > File Name: demo03.c > Author: FPF > Description: 字符型数据 > Created Time: 2025年01月21日 星期二 16时05分09秒 ************************************************************************/ #include <stdio.h> int main(int argc,char *argv[]) { char c1,c2; c1 = 97;// char既能赋值字符,也能赋值整数(ASCII码) c2 = 98; printf("%c %c \n",c1,c2);// a b, 以字符形式输出 printf("%d %d \n",c1,c2);// 97 98, 以整数形式输出 return 0; }
说明:char类型可以赋值为字符,也可以赋值为整数(char a = 128,显示的结果范围:-128~127),演示案例:
c1在内存的存储形式以及不同形式的输出,如下图所示:
案例
-
需求:大小写字母转换
-
代码:
/************************************************************************* > File Name: demo06.c > Author: 三道渊 > Description: > Created Time: 2025年07月09日 星期三 17时21分58秒 ************************************************************************/ #include <stdio.h> int main(int argc,char *argv[]) { char c1,c2; c1 = 'm'; c2 = 'Y'; printf("转换前:%c,%c\n",c1,c2); // 转换 c1 = c1 - 32; c2 = c2 + 32; printf("转换后:%c,%c\n",c1,c2); return 0; }
2717

被折叠的 条评论
为什么被折叠?



