Summary
0)对于所操作数据的具体类型,肯定要十分明确!
1)C 语言对数据的分类:整数类型、浮点数类型、字符类型(一般字符型、无回显字符型)。各个类型的基本区别在于,所占用的内存大小不同。
2)类型所占的字节数是由编译器决定的,32 位和 64 位的次要区别在于:指针所占字节数别离为 4 和 8;long 所占字节数别离为 4 和 8。
3)辨别初始化和赋值的关键点:赋值操作是在创立变量时候进行的,还是在创立变量之后进行的。
4)当遇到以下 2 种状况时:
- 以后的值曾经溢出了(超过了以后类型所能示意的范畴里的数)
- 大类型向小类型转换
对于溢出当前的值 :
正值:溢出的值 – 以后类型能示意的个数 = 理论值
负值:溢出的值 – 以后类型能示意的个数 = 理论值
5)sizeof 用于取得类型或者变量所占用的内存字节数,sizeof 作用于 数组名 时,能够失去数组占用的内存。
6)C 语言中字面量的默认类型:如 2 为 int,0.2 为 double,’2’ 为 char
1、数据类型与变量
1.1 C 语言中的数据类型
初学阶段应把握的类型:
整形:
- int:占用 4 个字节(32 位(bit)),示意范畴:-2147483648~2147483647(-231 ~ 231-1)。
- short:占用 2 个字节(16 位(bit)),示意范畴:-32678 ~ 32767。
浮点型:
- float:占用 4 个字节(32 位(bit)),示意范畴:-3.4 x 1038 ~ 3.4 x 1038。
- double:占用 8 个字节(64 位(bit)),示意范畴:-1.7 x 10-308 ~ 3.4 x 10308。
字符型:
- char:占用 1 个字节内存(8 位 (bit)),示意范畴:-128~127。字符数据应用单引号括起来。包含一般字符(英文字符类型,如 ’D’,’t’); 无回显字符类型( 无回显字符 必须以反斜杠 ’\’ 结尾,是一种打印后在屏幕上看不到的字符,如换行符 ’\n’, 制表符 ’\t’,这 是一个字符 );字符类型理论也是种 整型。
各个数据类型的基本区别在于,所示意的内存大小不同。
1.2 C 语言中变量的命名规定
- 字母(a-z, A-Z)、数字(0-9)、下划线(_)形成的字符序列
- 第一个字符必须为字符或者下划线(不能为数字)
- 大小写敏感(如 name 和 Name 是两个不同的变量名字)
// 小测试:以下哪些命名是非法的?()A.WORD B.-abc C.2c D._1
E.m_test F.a@b G.c3 H._
// A、D、E、G、H 非法
变量命名的标准:
1)见名知义:变量命名肯定要一眼能看出这个变量的用处
2)便于浏览:能够遵循一些标准,如“驼峰标准”,不便本人和别人浏览、保护代码。
1.3 C 语言中变量的定义
C 语言中创立变量的语法:type name;
如下:int n1;
double n2;
short n3;
初始化:在创立变量的 同时 ,给变量一个值。
赋值:在创立变量 之后,扭转变量的值。
int n1; // 定义变量,名为 n1,类型为 int
double hello; // 定义变量,名为 hello,类型为 double
int n2 = 2; // 定义变量,名为 n2,类型为 int,并初始化为 2
n1 = 1; // 赋值操作,扭转 n1 的值,使其示意 1
2、深刻数据类型与变量
2.1 程序中数值的类型
C 语言是类型严格的语言,字面量也有类型,应用字面量时也须要思考字面量的类型。字面量的类型包含默认类型和指定类型,如:
- 默认类型:2 为 int,0.2 为 double,’c’ 为 char
- 指定类型:0.2f 为 float(后缀 f 示意 float)
每种类型都有本人的容量(所占内存的大小),如果将大类型的值赛道小类型的容器内,可能放不进,会溢出。
大类型赋值给小类型时,可能产生溢出:
- 当数值在小类型范畴内 –> 赋值胜利
- 当数值超过小类型的范畴 –> 产生溢出
小类型能够平安的赋值给大类型:
- 浮点型赋值给整形,会产生截断 –> 小数局部失落
- 整形赋值给浮点类型 –> 赋值胜利
int a = 50000; // valid:50000 是一个字面量,默认类型为 int,在 int 能示意的范畴内
short b = 0; // 0 是一个字面量,默认类型为 int,int 到 short 类型的转换,可能出问题。// 实际上 0 在 b 能示意的范畴内,所以能失常赋值
b = a; // oops!赋值操作,扭转 b 的值为 int 类型的 50000,超过了 b 能示意的范畴,坏了
// 输入:b = -15536。为何是该值,见 summary
2.2 类型转换
C 语言中不同类型的变量之间(变量与字面量之间)进行赋值或运算时,会产生类型转换。类型转换不扭转原变量的值,仅仅是被赋值的变量的值产生扭转,并且可能会不失常。
开发小常识:
- 开发环境(编译软件)由编辑器和编译器组成
-
- 编辑器:负责程序的编写工作(字处理软件)
-
- 编译器:负责程序的编译工作(文本转为二进制)
- C 语言编译器查看类型的同时,可能做 默认转换
-
- short s = 2; // 字面量 2,类型为 int,被转换为 short
-
- double d = 2; // 字面量 2,类型为 int,被转换为 double
默认类型转换 :编译器晓得字面量 2 的类型是 int,但也明确的晓得初始化操作能够胜利(因为 2 在 short 能够示意的范畴内),因而编译器就会悄悄的将 2 的 int 转换为 short。
强制类型转换:也叫强制类型转换。规定:type name =(type)var;
int i = 40000;
short b = (short)i;
printf("i = %d\n", i); // i = 40000
printf("b = %d\n", b); // b = -25536
以上代码也验证了,类型转换不会扭转原来变量的值,只是扭转被赋值变量的值,且可能会产生异样(如 b 冀望是 40000,但理论输入是 -25536,起因见 summary4))。
3、再论数据类型
3.1 如果值超过了类型所能示意的最大范畴该怎么办
代码见 2.2。40000 超过了 short 能示意的范畴,这时候示意的值是个奇怪的值。论断如下:
* 当遇到以下 2 种状况时 :*
1)以后的值曾经溢出了(超过了以后类型所能示意的范畴里的数)
2)大类型向小类型转换
对于溢出当前的值 :
正值:溢出的值 – 以后类型能示意的个数 = 理论值
负值:溢出的值 – 以后类型能示意的个数 = 理论值
代码剖析:
short b = 40000; // output: -25536
// 40000 是溢出后的值(正值);short 类型占用内存 16bit,能示意 2^16 个数;// 理论值 = 40000 - 2^16 = 40000 - 65536 == -25536
unsigned short s = 0;
s = s - 1; // output: 65535
// - 1 是溢出后的值(负值);short 类型占用内存 16bit,能示意 2^16 个数;// 理论值 = -1 + 65536 = 65535
最初:程序运行时如果产生了越界:
- 大于类型最大值,则:运行后果回转到最小值左近
- 小于类型最小值,则:运行后果回转到最大值左近
3.2 sizeof 关键字
sizeof 用于获取类型或者变量所占用的内存大小(字节)
用法:
sizeof(type)
sizeof(variable)
sizeof variable // 此种形式并不为工程中罕用
int var = 1;
printf("%d\n", sizeof(var)); // 4
printf("%d\n", sizeof(int)); // 4
printf("%d\n", sizeof var); // 4
3.3 补充常识
1)整型 的扩大常识:
signed 和 unsigned 能够与 char、short、int 组合应用
惯例写法 | 残缺写法 | 示意的数据范畴 |
---|---|---|
char | signed char | -128~127 |
unsigned char | unsigned char | 0~255 |
short | signed short | -32768~32767 |
unsigned short | unsigned short | 0~65535 |
int | signed int | -2147483648~2147483647 |
unsigned int | unsigned int | 0~4294967295 |
2)对于打印输出,不同的类型值,要具体对应应用不同的格式化字符。
类型 | 对应的格式化字符 | 占用内存 |
---|---|---|
int | %d | 4 |
unsigned int | %u | 4,(有无符号不影响占用的内存) |
short | %d | 2 |
char | %c, %d | 1 |
long | %ld | 4 / 8, 别离对应 32 位和 64 位编译器 |
long long | %lld | 8 |
float | %f | 4 |
double | %f | 8 |
如果应用了不匹配的格式化字符,输入则可能有问题:
// eg.1
unsigned int u = 2147483648;
printf("u = %d\n", u); // -2147483648
printf("u = %u\n", u); // 2147483648
//eg.2
unsigned char c = 128;
printf("c = %d\n", c); // 128
例 1 中,为什么 2147483648 在 unsigned int 示意的范畴内,第一次输入还是不对?
起因在于 ,%d 格式化字符是针对有符号整型的,所以此时将 u 看做一个 int,利用 summary4) 的计算方法,的确输入了 -2147483648。如果依照正确的输入形式 %u,则输入的是期望值 2147483648。
例 2 中,unsigned char c 的值是 128,也是以 %d 的形式进行打印输出,此时 128 超过了 signed char 能示意的范畴,为什么不像例 1 中打印出错呢?
起因在于,128 这个值太小了,如果小于 signed int 能示意的最大值(2147483647),以 %d 形式打印就不会出错;如果大于了 2147483647,那么 %d 打印就会出错了。
所以,数据什么样的类型,就严格用对应的格式化字符去匹配。
3)左值和右值
左值:能够呈现在赋值符号右边的值,如:变量
右值:呈现在赋值符号左边的值,如:变量、字面量、计算结果(为右值)
4)数据的示意(简略,见后续 C 进阶课程)
浮点类型(float&double)对数据的示意是不精确的
整数类型(char,short,int,long)对数据的示意是精确的
浮点类型与整数类型在内存中对数据的 表示法齐全不同
本文总结自“狄泰软件学院”唐佐林老师《C 语言入门课程》。
如有错漏之处,恳请斧正。