《C语言程序设计》第二章 基本数据类型
目录:
2.1 常量与变量
-
2.1.1 常量
-
2.1.2 变量
2.2 简单的屏幕输出
2.3 数据类型
2.4 如何计算变量或数据类型所占内存空间的大小
2.5 变量的赋值和赋值运算符
2.6 本章扩充内容
2.7 本章知识点小结
2.8 本章常见错误小结
2.1.1 常量
不同类型的整型常量 | 实例 | 特点 |
有符号整型常量 | 10,-30,0 | 默认的int型定义为有符号整数,因此对int型无须使用signed |
无符号整型常量 |
30u, 256U |
无符号整型常量由常量值后跟U或u来表示,不能表示成小于0的数,如-30u就是不合法的 |
长整型常量 | -256l,1024L | 长整型常数由常数值后跟L或l来表示 |
无符号长整型常量 | 30lu | 无符号长整型常量由常数值后跟LU、Lu、lU或lu来表示 |
不同类型的实型常量 | 实例 | 特点 |
单精度实型常量 | 1.25F,1.25e-2f | 单精度实型常量由常量值后跟F或f来表示 |
双精度实型常量 | 0.123,-12.35,.98 | 实型常量隐含按双精度型处理 |
长双精度实型常量 | 1.25L | 长双精度型常量由常量值后跟L或l来表示 |
2.1.2 变量
- 定义变量的一般形式:类型关键字 变量名;
- 关键字(Keyword):C语言预先规定的、具有特殊意义的单词
int main(void) { int a; //用关键字int指定变量a的类型 float b; //用关键字float指定变量b的类型 char c; //用关键字char指定变量c的类型 a=1; //为int型变量a赋值整型变量1 b=2.5; //为float型变量b赋值实型变量2.5 c='A'; //为char型变量c赋值字符型变量'A' return 0; }
- 一个C 程序必须且只能有一个用main作为名字的函数,这个函数成为主函数;main后面圆括号内的void表示它没有函数参数;main前面的int表示函数执行后会返回操作系统一个整数型,在main函数的函数体中的最后一条语句使用return语句返回了这个值,通常返回0表示程序正常结束。
- C语言允许在定义变量的同时对变量初始化(为其赋初值):
int main(void) { int a=1; //定义整型变量a并对其初始化 float b=2.5; //定义实型变量b并对其初始化 char c='A'; //定义字符型变量c并对其初始化 return 0; }
- 如果定义了一个变量,但未对其进行初始化,那么该变量的值是一个随机数(静态变量和全局变量除外)
- 跨行注释:
#include<stdio.h> #include<stdlib.h> int main() { printf("char %d\n",sizeof(char)); printf("int %d\n",sizeof(int)); printf("short int %d\n",sizeof(short)); /*若一行写不完注释 可以用这样的方法写多行注释 */ return 0; }
- 在一条语句中,可同时定义多个相同类型的变量,多个变量之间用逗号作分隔符,其书写的先后顺序无关紧要。
//定义三个整型变量: int a,b,c; //在定义变量的同时将其初始化为0: int a=0,b=0,c=0; //但是不能写成: int a=b=c=0;
2.2 简单的屏幕输出
#include<stdio.h> int main(void) { int a=1; float b=2.5; char c='A'; printf("a=%d\n",a); //按整型格式输出变量a的值 printf("b=%f\n",b); //按实数格式输出变量b的值 printf("c=%c\n",c); //按字符串格式输出变量c的值 printf("End of program\n"); //输出一个字符串 return 0; } 会输出: a=1 b=2.500000 c=A End of program
- 程序第一行以#开头而未以分号结尾的不是C语句,而是C的编译预处理命令;尖括号内的文件称为头文件,h为head之意,std为standard之意,i为input之意,o为output之意;编译预处理命令#include可使头文件在程序中生效,它的作用是:将写在尖括号内的输入/输出函数的头文件stdio.h包含到用户源文件中。
- 格式字符详解:
1.d格式字符
功能:用来输出十进制数
格式:%d:按整型数据的实际长度输出
%md:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补一空格;若大于m,则按实际位数输出。
%ld:输出长整型数据。2.o格式字符
功能:以八进制形式输出整数;
格式:%o:按整型数据的实际长度输出
%mo:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补一空格;若大于m,则按实际位数输出。
%lo:输出长整型数据。3.x格式字符
功能:以十六进制形式输出整数
格式:%x:按整型数据的实际长度输出
%mx:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补一空格;若大于m,则按实际位数输出。
%lx:输出长整型数据。4.u格式字符
功能:以十进制数输出无符号整数
格式:%u:按整型数据的实际长度输出
%mu:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补一空格;若大于m,则按实际位数输出。
%lu:输出长整型数据。5.c格式字符
功能:输出单个字符
格式:%c:按整型数据的实际长度输出
%mc:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补一空格;若大于m,则按实际位数输出。
%lc:输出长整型数据。6.s格式字符
功能:输出字符串
格式:%s:按整型数据的实际长度输出
%ms:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补一空格;若大于m,则按实际位数输出。
%ls:输出长整型数据。7.f格式字符
功能:以小数形式输出单、双精度实数
格式:%f:按整型数据的实际长度输出
%mf:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补一空格;若大于m,则按实际位数输出。
%lf:输出长整型数据。8.e格式字符
功能:以指数形式输出单、双精度实数
格式:%e:按整型数据的实际长度输出
%me:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补一空格;若大于m,则按实际位数输出。
%le:输出长整型数据。9.g格式字符
功能:以%f、%e中较短的输出宽度输出单、双精度实数
格式:%g:按整型数据的实际长度输出
%mg:m为指定的输出字段的宽度。如果数据的位数小于m,则左端补一空格;若大于m,则按实际位数输出。
%lg:输出长整型数据。 - 字符串:用一对双引号括起来的若干字符。
2.3 数据类型
数据类型分类 | 关键字 | 变量声明实例 | 详细章节 | ||
基 本 类 型 |
整型 | 基本整型 | int | int a; |
第2章 第4章 |
长整型 | long | long int a; 或者 long a; | |||
长长整型 | long long | long long int a;或者 long long a; | |||
短整型 | short | short int a; 或者 short a; | |||
无符号整型 | unsigned |
unsigned int a; unsigned long a; unsigned short a; |
|||
实型 (浮点型) |
单精度实型 | float | float a; | ||
双精度整型 | double | double a; | |||
长双精度整型 | long double | long double a; | |||
字符型 | char | char a; |
第4章 第10章 |
||
枚举类型 | enum |
enum response{no,yes,none}; enum response answer; |
第12章 | ||
构 造 类 型 |
数组 | — |
int score[10]; char name[20]; |
第8章 | |
结构体 | struct |
struct date { int year; int month; int day; }; struct date d; |
第12章 | ||
共用体 | union |
union { int single; char spouseName[20]; struct date divorcedDay; }married; |
|||
指针类型 | — |
int * ptr; char * pStr; |
第9~11章 | ||
无类型 | void |
void Sort(int array[] , int n); void *malloc(unsigned int size); |
第8章 第11章 |
- 定义整型变量时,只要不指定为无符号型,其隐含的类型就是有符号型,而signed通常是省略不写的。
2.4 如何计算变量或数据类型所占内存空间的大小
- 一个字节(Byte)可以表示的整数最小为0,最大为255,一个字节等于8个二进制位(bit),也称比特。bit是binary digit二进制数的缩写,位是衡量物理存储器容量的最小单位。
英文称谓 | 中文称谓 | 字节大小 | 换算方法 |
1b(bite) | 比特 | ||
1B(Byte) | 字节 | 一个字节 | 1B=8bit |
1KB(Kilobyte) | K | 一千字节 |
1KB=1024B=210B |
1MB(Megabyte) | 兆 | 百万字节 | 1MB=1024KB=220B |
1GB(Gigabyte) | 吉 | 十亿字节,又称“千兆” | 1GB=1024MB=230B |
1TB(Terabyte) | 太 | 万亿字节 | 1TB=1024GB=240B |
1PB(Petabyte) | 拍 | 千万亿字节 | 1PB=1024TB=250B |
1EB(Exabyte) | 艾 | 百亿亿字节 | 1EB=1024PB=260B |
1ZB(Zettabyte) | 泽 | 十万亿亿字节 | 1ZB=1024EB=270B |
1YB(Yottabyte) | 尧 | 一亿亿亿字节 | 1YB=1024ZB=280B |
1BB(Brontobyte) | 一千亿亿亿字节 | 1BB=1024YB=290B | |
1NB(Nonabyte) | 一百万亿亿亿字节 | 1NB=1024BB=2100B | |
1DB(Doggabyte) | 十亿亿亿亿字节 | 1DB=1024NB=2110B |
#include<stdio.h> int main(void) { printf("Data type Number of bytes\n"); printf("---------- -----------------\n"); printf("char %d\n",sizeof(char)); printf("int %d\n",sizeof(int)); printf("short int %d\n",sizeof(short)); printf("long int %d\n",sizeof(long)); printf("long long int %d\n",sizeof(long long)); printf("float %d\n",sizeof(float)); printf("double %d\n",sizeof(double)); printf("long double %d\n",sizeof(long double)); return 0; }
输出:
Data type Number of bytes
---------- -----------------
char 1
int 4
short int 2
long int 4
long long int 8
float 4
double 8
long double 16
- 注:这个程序在不同的操作系统和编译环境下的运行结果可能有所差异。
2.5 变量的赋值和赋值运算符
- 在计算含有不同类型运算符的表达式时,要考虑运算符的优先级,根据优先级确定运算的顺序,即先执行优先级高的运算,然后执行优先级低的运算。
- 运算符的结合性:一种是左结合,即自左向右计算;另一种是右结合,即自右向左计算。
C语言中需要两个操作数的算术运算符是左结合的,例如:x/y*z=(x/y)*z。
而赋值运算符则是右结合的,例如:a=b=c=0;与a=(b=(c=0));是等价的<多重赋值>。
2.6 本章扩充内容
- 有符号整数和无符号整数
有符号整数和无符号整数的区别在于怎样解释整数的最高位。对于无符号整数,其最高位被C编译器解释为数据位。而对于有符号整数,C编译器将其最高位解释为符号位,若符号位为0,则表示该数为正数;若符号位为1,则表示该数为负数。
- 原码:将一个整数换算成二进制,就是其原码。
- 反码:正数的反码就是其原码,负数的反码是除符号位每一位取反(即0变1,1变0)。
- 补码:正数的补码就是其原码,负数的反码+1就是其补码。
例:(“┊”前为符号位)
-1的原码
1┊0 | 00 | 00 | 00 | 00 | 00 | 00 | 01 |
-1的反码
1┊1 | 11 | 11 | 11 | 11 | 11 | 11 | 10 |
-1的补码
1┊1 | 11 | 11 | 11 | 11 | 11 | 11 | 11 |
如图所示,如果将最高位解释为符号位(有符号竖数),则该数为-1;如果将最高位解释为数据位(无符号数),那么该数就是1*20+1*21+1*22+1*23+1*24+1*25+1*26+1*27+1*28+1*29+1*210+1*211+1*212+1*213+1*214+1*215=65535
- 在计算机内存中用补码表示负数的原因:首先,可以将减法运算转化为加法运算来处理。eg.将7-6转化为(+7)+(-6)来处理;其次,可以用统一的形式来表示0(否则会出现+0和-0),+0和-0的原码不同,补码相同。
2.实型数据在内存中的存储格式
对于实数,无论是小数表示形式还是指数表示形式,在计算机内部都采用浮点形式来储存。
浮点形式是相对于定点形式而言的。所谓定点数是指小数点位置是固定的,小数点位于符号位和第一个数值位之间,它表示的是纯小数;整型数据是定点表示的特例,只不过它的小数点的位置在数值位之后而已。
所谓浮点数是指小数点的位置是可以浮动的数。例如,十进制数1234.56可以写成:1234.56 0.123456*104 1.23456*103 或者 12345.6*10-1,这里随着10的指数的变化,小数点的位置也会发生相应的变化。
通常,浮点数是将实数分为阶码和尾数两部分来表示。例如,实数N可以表示为:N=S*rj. 其中,S为尾数(正负均可),一般规定用纯小数形式;j为阶码(正负均可,但必须是整数);r是基数,对二进制数而言,r=2,即N=S*2j。例如:10.0111=0.100111*210。
浮点数在计算机中的存储格式如图所示:
阶码j | 尾数S | ||
阶码符号 | 阶码的数值 | 尾数符号 | 尾数的数值 |
- 阶码:实数的指数部分;尾数:小数部分。
- 阶码所占的 位数决定实数的表数范围;尾数所占的位数决定实数的精度,尾数的符号决定实数的正负。
- 浮点表示法的表数范围远远大于定点表示法,而且也更灵活。
3.单精度实型和双精度实型的有效位数
//将同一实型数分别赋值给单精度实型和双精度实型变量,然后打印输出
#include<stdio.h> int main(void) { float a; double b; a=123456.789e4; b=123456.789e4; printf("%f\n%f\n",a,b); return 0; }
输出:
1234567936.000000
1234567890.000000
- 原因:单精度实型(float型)变量和双精度实型(double型)变量所接收的实型变量的有效数字位数不同。一般而言,double型变量可以接收实型常量的16位有效数字,而float型变量仅能接收实型常量的7位有效数字,在有效数字后面输出的数字都是不准确的。因此,将double型数据赋值给float型变量时有可能发生数据截断错误,从而产生舍入误差。
2.7 本章知识点小结
略
2.8 本章常见错误小结
常见错误实例 | 常见错误描述 | 错误类型 |
— | 变量未定义就使用 | 编译错误 |
int newValue; newvalue=0; |
忽略了变量区分大小写,使得定义的变量和使用的变量不 同名 |
编译错误 |
printf=("Input n:") int n; |
在可执行语句之后定义变量 | 编译错误 |
int n=3.5 |
在定义变量时,用于变量初始化的常量类型与定义的变量 类型不一致 |
有的编译器 不提示错误 |
int m=n=0; | 在定义变量时,对多个变量进行连续赋初值 | 编译错误 |