基本数据类型

转义字符

非打印字符
单引号只适用于字符、数字和标点符号,浏览ASCII表会发现,有些ASCII字符打印不出来。例如,一些代表行为的字符(如,退格、换行、终端响铃或蜂鸣)。C语言提供了3种方法表示这些字符。
第1种方法前面介绍过一使用 ASCII码。例如,蜂鸣字符的ASCII值是7,因此可以这样写:
char beep = 7;
第2种方法是,使用特殊的符号序列表示一些特殊的字符。这些符号序列叫作转义序列( escapesequence)。表3.2列出了转义序列及其含义。
把转义序列赋给字符变量时,必须用单引号把转义序列括起来。例如,假设有下面一行代码:
char nerf = ‘\n’ ;
稍后打印变量nerf的效果是,在打印机或屏幕上另起一行。
image.png

定义变量

include
#include
int main (void) //void 无类型
{
int a = 208687 , b=523066; //定义一个int型变量 变量名字是a,并将208687赋值 给a。
/如果我们测试的数比较多,208687,这个数不好记,如果我们使用的次数很多,位置很多。比如有一百处,就要修改一百处
错一次程序就会出问题。我们可以定义一个整型,变量来装着这个数。int a = 208687。这个数就可以用a来代替,即方便又精准
哪天想换数据了,直接改一个位置 int a= 123 就可以了
/
printf(“%d,%d\n” , a ,b);
printf(“%d,%d\n” , a ,b);
//printf(“%d,%d\n” ,123456 ,654321);
//printf(“%d,%d\n” ,123456 ,654321);
system(“pause”);
return 0;
}

常量与变量

在程序的指导下,计算机可以做许多事情,如数值计算、名字排序、执行语言或视频命令、计算彗星轨道、准备邮件列表、拨电话号码、画画、做决策或其他你能想到的事情。要完成这些任务,程序需要使用数据,即承载信息的数字和字符。有些数据类型在程序使用之前已经预先设定好了,在整个程序的运行过程中没有变化,这些称为常量(constant)。
其他数据类型在程序运行期间可能会改变或被赋值,这些称为变量(variable)。

int整型

int类型
C语言提供了许多整数类型,为什么一种类型不够用?因为C语言让程序员针对不同情况选择不同的类型。特别是,C语言中的整数类型可表示不同的取值范围和正负值。一般情况使用int类型即可,但是为满足特定任务和机器的要求,还可以选择其他类型。
int类型是有符号整型,即int类型的值必须是整数,可以是正整数、负整数或零。其取值范围依计算机系统而异。-般而言,储存一个int要占用一个机器字长。因此,早期的16位IBM PC兼容机使用16位来储存一一个int值,其取值范围(即int值的取值范围)是-32768~32767。目前的个人计算机一般是32位,因此用32位储存一个int值。现在,个人计算机产业正逐步向着64位处理器发展,自然能储存更大的整数。ISO C规定int的取值范围最小为-32768~32767。一-般而言,系统用一个特殊位的值表示有符号整数的正负号。
1. 声明int变量
第2章中已经用int声明过基本整型变量。先写上int,然后写变量名,最后加上一个分号。要声明多个变量,可以单独声明每个变量,也可在int后面列出多个变量名,变量名之间用逗号分隔。下面都是有效的声明:
int erns;
int hogs, COWs, goats;
可以分别在4条声明中声明各变量,也可以在一-条声明中声明4个变量。两种方法的效果相同,都为4个int大小的变量赋予名称并分配内存空间。以上声明创建了变量,但是并没有给它们提供值。变量如何获得值?前面介绍过在程序中获取值的两种途径。第1种途径是赋值:
cows = 112;
第2种途径是,通过函数(如,scanf()) 获得值。接下来,我们着重介绍第3种途径。
2.初始化变量
初始化(initialize) 变量就是为变量赋一- 个初始值。在C语言中,初始化可以直接在声明中完成。只需
在变量名后面加上赋值运算符(=) 和待赋给变量的值即可。如下所示:
int hogs = 21;
int cows = 32,goats = 14;
int dogs,cats = 94; /有效,但是这种格式很糟糕/
以上示例的最后一-行, 只初始化了cats,并未初始化dogs。这种写法很容易让人误认为dogs也被
初始化为94,所以最好不要把初始化的变量和未初始化的变量放在同一条声明中。
简而言之,声明为变量创建和标记存储空间,并为其指定初始值(如图3.4所示)。
image.png
其他整型内存模型也是如此,如short短整型,和long长整型,unsigned int,等…

float 、double 浮点型

include
#include
int main (void)
{
float f = 233.123456789; //精确是从2开始算的,有效数位8位

double d = 233.123456789123456789; //有效数位17
long double lf = 123.10;
printf (“ %f\n %.20lf\n %lf\n”, f, d, lf);// %e 科学记数法

system (“pause”);
return 0;
}

char 字符型

char类型用于储存字符(如,字母或标点符号),但是从技术层面看,char是整数类型。因为char类型实际上储存的是整数而不是字符。计算机使用数字编码来处理字符,即用特定的整数表示特定的字符。美国最常用的编码是ASCII编码,本书也使用此编码。例如,在ASCII码中,整数65代表大写字母A。因此,储存字母A实际上储存的是整数65 (许多IBM的大型主机使用另- -种编码一-EBCDIC, 其原理相同。另外,其他国家的计算机系统可能使用完全不同的编码)。
1. 声明char类型变量
char类型变量的声明方式与其他类型变量的声明方式相同。下面是一些例子:
char response;
char itable, latan;
以上声明创建了3个char类型的变量: response、 itable 和latan.
2.字符常量和初始化
如果要把-一个字符常量初始化为字母A,不必背下ASCII码,用计算机语言很容易做到。通过以下初
始化把字母A赋给grade即可:
char grade = ‘A’ ;
在C语言中,用单引号括起来的单个字符被称为字符常量(character constant)。 编译器一发现’A’, 就
会将其转换成相应的代码值。单引号必不可少。下 面还有- -些其他的例子:
char broiled;
/声明一个char类型的变量/
broiled = ‘T’ ;
/为其赋值,正确/
broiled = T;
/错误!此时T是一个变量/
broiled = “T”;
/错误!此时”T”是一个字符串/
如上所示,如果省略单引号,编译器认为T是-一个变量名:如果把T用双引号括起来,编译器则认为”T”是一个字符串。一个char,占1字节。
实际上,字符是以数值形式储存的,所以也可使用数字代码值来赋值:
char grade = 65; / 对于ASCII,这样做没问题,但这是一种不好的编程风格/
在本例中,虽然65是int类型,但是它在char类型能表示的范围内,所以将其赋值给grade没问题。由于65是字母A对应的ASCII码,因此本例是把A赋给grade。注意,能这样做的前提是系统使用ASCII码。其实,用’A’代替65才是较为妥当的做法,这样在任何系统中都不会出问题。因此,最好使用字符常量,而不是数字代码值。

打印字符

打印字符
printf ()函数用&c指明待打印的字符。前面介绍过,-一个字符变量实际上被储存为1字节的整数值。
因此,如果用:d转换说明打印char 类型变量的值,打印的是-一个整数。而8c转换说明告诉printf ()打印该整数值对应的字符。程序清单3.5演示了打印char类型变量的两种方式。
/ charcode.c-显示字符的代码编号/
#include
{
int main (void)
char ch;
printf (“Please enter a character. \n”) ;
scanf (“%c”,&ch) ;
/ 用户输入字符/
printf (“The code for %c is %d. \n”,ch, ch) ;
return 0;
}
运行该程序后,输出示例如下:
Please enter a character.
C
The code for C is 67.
运行该程序时,在输入字母后不要忘记按下Enter或Return键。随后,scanf ()函数会读取用户输入的字符,&符号表示把输入的字符赋给变量ch。接着,printf ()函数打印ch的值两次,第1次打印一个字符(对应代码中的%c),第2次打印一个十进制整数值( 对应代码中的8d)。注意,printf() 函数中的转换说明决定了数据的显示方式,而不是数据的储存方式(见图3.6)。
image.png
5.有符号还是无符号:

有些C编译器把char实现为有符号类型,这意味着char可表示的范围是-128~127。而有些C编译器把char实现为无符号类型,那么char可表示的范围是0~255。请查阅相应的编译器手册,确定正在使用的编译器如何实现char类型。或者,可以查阅limits.h头文件。下一-章将详细介绍头文件的内容。根据C90标准,C语言允许在关键字char前面使用signed或unsigned.这样,无论编译器默认char是什么类型,signed char 表示有符号类型,而unsigned char 表示无符号类型。这在用char类型处理小整数时很有用。如果只用char处理字符,那么char前面无需使用任何修饰符。

基本数据类型总结

关键字:
基本数据类型由11个关键字组成: int、 long、short. unsigned. char. float. double.
signed、 Bool、 Complex 和 Imaginary.
有符号整型:
有符号整型可用于表示正整数和负整数。
int一系统给定的基本整数类型。C语言规定int类型不小于16位。也就是2字节。
short或short int一最大的 short类型整数小于或等于最大的int类型整数。C语言规定short类型至少占16 位。也就是2字节。
long或long int一该类 型可表示的整数大于或等于最大的int类型整数。C语言规定long类型至少占32位。也就是4字节。
long long或long long int一该类 型可表示的整数大于或等于最大的1ong类型整数。Long 1ong类型至少占64位。也就是8字节。
一般而言,long类型占用的内存比short类型大,int 类型的宽度要么和long类型相同,要么和short类型相同。例如,旧DOS系统的PC提供16位的short和int,以及32位的long;
Windows95系统提供16 位的short以及32位的int和long.
无符号整型:
无符号整型只能用于表示零和正整数,因此无符号整型可表示的正整数比有符号整型的大。在整型类型前加上关键字unsigned表明该类型是无符号整型: unsignedint unsigned long、unsigned short。单独的unsigned相当于unsignedint。
字符类型:
可打印出来的符号(如A、&和+)都是字符。根据定义,char 类型表示一个字符要占用1字节内存。出于历史原因,1字节通常是8位,但是如果要表示基本字符集,也可以是16位或更大。
char
字符类型的关键字。有些编译器使用有符号的char,而有些则使用无符号的char.
在需要时,可在char前面加上关键字signed或unsigned来指明具体使用哪一种类型。
布尔类型:
布尔值表示true和false. C语言用1表示true,0表示false.
**
Bool-布 尔类型的关键字。布尔类型是无符号int 类型,所占用的空间只要能储存0或1即可。
实浮点类型:
实浮点类型可表示正浮点数和负浮点数。
float 系统的基本浮点类型,可精确表示至少6位有效数字。
double 储存浮点数的范围(可能)更大,能表示比float类型更多的有效数字(至少10
位,通常会更多)和更大的指数。
long double 一储存浮 点数的范围(可能)比double更大,能表示比double更多的有效数
字和更大的指数。
3.6
参数和陷阱**
有必要再次提醒读者注意printf()函数的用法。读者应该还记得,传递给函数的信息被称为参数。
例如,printf(“Hello, pal.”) 函数调用有-一个参数: “Hello,pal.”。 双引号中的字符序列( 如,
“Hello,pal.”)被称为字符串(string), 第4章将详细讲解相关内容。现在,关键是要理解无论双引号中
包含多少个字符和标点符号,-一个字符串就是-一个参数。
与此类似,scanf (“d”, &weight) 函数调用有两个参数: “&d” 和&weight。C语言用逗号分隔函数中的参数。
printf()和scanf()函数与一般函数不同,它们的参数个数是可变的。例如,前面的程序示例中调用过带-一个、两个,甚至三个参数的printf() 函数。程序要知道函数的参数个数才能正常工作。
printf()和scanf()函数用第1个参数表明后续有多少个参数,即第1个字符串中的转换说明与后面的参数一一对应。例如,下 面的语句有两个&d转换说明,说明后面还有两个参数:printf (“8d cats ate 号d cans of tuna\n”, cats, cans) ;
后面的确还有两个参数: cats 和cans。
程序员要负责确保转换说明的数量、类型与后面参数的数量、类型相匹配。现在,C语言通过函数原型机制检查函数调用时参数的个数和类型是否正确。但是,该机制对printf()和scanf()不起作用,因为这两个函数的参数个数可变。如果参数在匹配上有问题,会出现什么情况?假设你编写了程序清单3.9

基本数据类型拓展

基本数据类型表格

类型 长度/字节 取值范围 存储方式
char 1 -128~127 有符号二进制补码形式
[signed]char 1 -128~127
unsigned char 1 0~255
short [int] 2 -32768~32767
unsigned short [int] 2 0~65535
int 4 -2147483648~2147483647 定点有符号二进制补码形式
[signed] int 4 -2147483648~2147483647
unsigned [int] 4 0~4294967295
long [int] 4 -2147483648~2147483647
[signed] long [int] 4 -2147483648~2147483647
unsigned long [int] 4 0~4294967295
float 4 -3.410^38~3.410^38 浮点形式存储
double 8 -1.79810^308~1.79810^308 浮点形式存储
long double 8 -1.79810^308~1.79810^308

short int<=int<=long int<=long long int
float<=double<=long double

unsigned 和 signed 的区别

1、signed是默认的,表示这个变量bai是有符号的,可以存储整数和负数。
2、unsigned则需要显示给出表示这个变量,没有符号值能存储数的大小,而且不能表示正负。
3、signed存储符号是有代价的,代价就是存储空间中的一个比特位专门用来存储符号,这一位不能表示数值。一般来说,同类型的signed能够存储的数的绝对值大小要小于undigned。
4、unsigned的作用就是将数字类型无符号化, 例如 int 型的范围:-2^31 ~ 2^31 - 1,而unsigned int的范围:0 ~ 2^32。
signed类型的整数,只用了去除最高位,剩下的15位来进行编码的,而最高位只是用来做标记(sign),标记整数的正负,0表示正,1表示负。所以对于signed的整数,的存储范围是(-2^15 to 2^15-1),也就是 -32768 到 +32767的整数。
而对于unsigned的整数,其16位全部用来编码,存储范围便是(0 to 2^16-1),即 0到 65535 的非负整数。所以呢 你可以声明 int a = 1,或者 int a = -1, 但是不可以声明 unsigned a = -1 。但是需要提到的一点是,不管整数的类型是signed 还是 unsigned,都用了16位来存储,也就是说16位全部用来存储数据。

记数法示例

image.png
第1列是一般记数法;第2列是科学记数法;第3列是指数记数法(或称为e记数法),这是科学记数
法在计算机中的写法,e后面的数字代表10的指数。图3.7演示了更多的浮点数写法。
C标准规定,float 类型必须至少能表示6位有效数字,且取值范围至少是10^37~10+37。前一项规定指float类型必须至少精确表示小数点后的6位有效数字,如33.333333。后- -项规定用于方便地表示诸如太阳质量(2.0e30 千克)、一个质子的电荷量(1.6e-19库仑)或国家债务之类的数字。通常,系统储存一个浮点数要占用32位。其中8位用于表示指数的值和符号,剩下24位用于表示非指数部分(也叫作尾数或有效数)及其符号。

浮点型的精确 有效数位

C语言提供的另- -种浮点类型是double (意为双精度)。double类型和float类型的最小取值范围相同,但至少必须能表示10位有效数字。- -般情况下,double 占用64位而不是32位。一些系统将多出的32位全部用来表示非指数部分,这不仅增加了有效数字的位数(即提高了精度),而且还减少了舍入误差。另一些系统把其中的一些位分配给指数部分,以容纳更大的指数,从而增加了可表示数的范围。无论哪种方法,double 类型的值至少有13位有效数字,超过了标准的最低位数规定。C语言的第3种浮点类型是long double,以满足比double类型更高的精度要求。不过,C只保证long double 类型至少与double类型的精度相同。 可自行测试

浮点型的打印

通常,4.0和2.0被储存为64位的double类型,使用双精度进行乘法运算,然后将乘积截断成float类型的宽度。这样做虽然计算精度更高,但是会减慢程序的运行速度。
在浮点数后面加上f或F后缀可覆盖默认设置,编译器会将浮点型常量看作float类型,如2.3f和9.11E9F。使用1或L后缀使得数字成为long double 类型,如54.31和4.32L。注意,建议使用L后缀,因为字母1和数字1很容易混淆。没有后缀的浮点型常量是double类型。
C99标准添加了一种新的浮点型常量格式一用 十六进制表示浮点型常量,即在十六进制数前加上十六进制前缀(0x或0X),用p和P分别代替e和E,用2的幂代替10的幂(即,p计数法)。如下所示:0xa.1fp10十六进制a等于十进制10, .1f是1/16加上15/256 (十六进制f等于十进制15),p10是22°或1024。0xa.1fp10 表示的值是(10 + 1/16 + 15/256) X1024 (即,十进制10364. 0)。
注意,并非所有的编译器都支持C99的这一特性。
float用 %f 打印 double用 %lf 打印
测试有效数位
float 有效数位到7位 double则是16位