从一个简单的程序开始

#include <stdio.h>

int main(void)
{
float weight;
float value; printf("Please enter your book's weight:"); scanf("%f", &weight); //用户输入 value = 17 * weight * 14.5833; printf("Your book's weight is %f and value is %.2f\n", weight, value); return 0;
}

程序运行结果

程序提示输入,156为输入的值,输入完成后要按Enter键,按Enter键是告诉计算机,你已经完成输入数据。

scanf("%f", &weight):scanf()函数用于读取键盘的输入,%f告诉scanf()函数要读取用户从键盘输入的浮点数,&weight告诉scanf()函数把输入的值赋给变量weight,scanf()函数使用&符号表明找到weight变量的地址。

scanf()函数读取用户从键盘输入的数据,并把数据传递给程序,printf()函数读取程序中的数据,并把数据显示在屏幕上。

printf()函数用%f来处理浮点值,%.2f中的“.2”用于精确控制输出,指定输出的浮点数只显示小数点后两位。

有些数据类型在程序使用之前已经预先设定好了,在整个程序的运行过程中没有变化,这些数据类型称为常量。17,14.5833就是常量。

其他数据类型在程序运行过程中可能会改变或被赋值,这些数据类型成为变量。weight,value就是变量。

位、字节和字:

位(bit)是最小的存储单位,可以存储0和1,或者说,位用于设置“开”或“关”,位是计算机内存的基本构建块。

字节(byte)是常用的计算机存储单位,1字节为8位,1位可以表示0或1,那么8位字节就有256(2的8次方)种可能的0、1的组合。

字(word)是设计计算机时给定的自然存储单位,计算机的字长越大,其数据转移越快,允许的内存访问也更多。

整数和浮点数:

和数学的概念一样,在C语言中,整数是没有小数部分的数,计算机以二进制数字储存整数。

浮点数和整数的储存方案不同,计算机把浮点数分成小数部分和指数部分来表示,而且分开来储存这两部分,7.00和7的值是一样的,但是储存方式不同。

在十进制中。可以把7.0写成0.7E1,0.7是小数部分,E后的1是指数部分。

计算机在内部使用二进制和2的幂进行储存,而不是10的幂。

2.75,3.16E7,7.00,2e-8都是浮点数,3.16E7表示3.16*107 ,7被称为指数。

整数和浮点数的区别:

整数没有小数部分,浮点数有小数部分。

浮点数可以表示的范围比整数大。

对于一些运算,浮点数损失的精度更多。

计算机的浮点数不能表示区间内所有的值,浮点数通常只是实际值的近似值。

int类型:

int类型是有符号的整型,int类型的值必须是整数,可以是正的,也可以是负的,也可以是0。

ISO C规定int的取值范围最小为-32768~32767。

声明int变量:先写上int,然后写变量名,最后加上一个分号

int weight;  //声明一个int类型的变量
int weight, height; //声明多个int类型的变量

然后可以通过直接赋值给变量赋值,也可以通过函数给变量赋值

weight = 200;  //直接赋值给变量

scanf("%d", &weight);  //通过函数赋值

初始化变量:初始化变量就是为变量赋一个初始值。

在C语言中,初始化可以直接在声明中完成。在变量名后面加上赋值运算符(=)和待赋值给变量的值。

int one = 1;

int two =2, three = 3;

int four, five = 5;

第3行中的four并没有被赋值,只有five被赋值。最好不要把初始化的变量和未初始化的变量放在同一条声明中。

声明为变量创建和标记存储空间,并为其指定初始值。

打印int类型的值:%d指明了在一行中打印整数的位置

#include <stdio.h>

int main(void)
{
int one = 1;
int five = 5; printf("One is %d and Five is %d, their subtraction is %d\n", one, 5, five - one);
printf("First is %d, %d, %d, %d, %d, %d\n", one); //少了5个参数 return 0;
}

运行结果

第一行中,第1个%d对应的是int类型变量one,第2个%d对应的是int类型常量5,第3个%d对应的为int类型表达式five - one的值。

第二行中,第1个%d对应的是int类型变量one,没有给后面的5个%d传值,所以打印出的值是内存中的任意值。

在不同的平台下,缺少参数或参数类型不匹配导致的结果不同。

八进制和十六进制:

0前缀表示八进制,十进制16表示成八进制为020。

0x或0X前缀表示十六进制,十进制16表示成十六进制是0x10或0X10。

打印八进制和十六进制:

以十进制打印数字,使用%d

以八进制打印数字,使用%o

以十六进制打印数字,使用%x

如果要显示各进制的前缀0,0x和0X,分别用%#o,%#x,%#X

#include <stdio.h>

/*以十进制、八进制、十六进制打印十进制数100*/
int main(void)
{
int x = 100; printf("dec = %d, octal = %o, hex = %x\n", x, x, x);
printf("dec = %d, octal = %#o, hex = %#x\n", x, x, x); return 0;
}

运行结果

其他整数类型:

short int 类型(或者简写成 short)占用的存储空间可能比 int 类型少,常用于小数值的场合以节省空间,short 有符号类型。

long int 或 long 占用的存储空间可能比 int 多。试用于较大数值的场合,long 也是有符号类型的。

long long int 或 long long 占用的储存空间可能比 long 多,适用于更大数值的场合,该类型至少占64位,long long 有符号类型。

unsigned int 或 unsigned,unsigned short int 或 unsigned short,unsigned long int 或 unsigned long,unsigned long long int 或 unsigned long long 只用于非负值的场合,这种类型与有符号类型表示的范围不同。16位 unsigned int 允许的取值范围是 0~65535,而不是-32768~32767。

在任何有符号类型前面添加关键字 signed,可强调使用有符号类型的意图。

使用多种整数类型的原因:

C语言规定short占用的存储空间不能多于 int,long 占用的存储空间不能少于 int。

现在最常见的设置是,long long 占64位,long 占32位,int 占16位或32位,short 占16位。

这4种类型代表4种不同的大小,但是实际使用中,有些类型之间通常用重叠。

C标准对基本数据类型规定了允许的最小大小。

对于16位机,short 和 int 的最小取值范围为[-32767,32767]

对于32位机,long 的最小取值范围为[-2147483647,2147483647]

对于 unsigned short 和 unsigned int ,最小取值范围为[0,65535]

对于 unsigned long,最小取值范围为[0,4294967295]

long long 的最小取值范围为[-9223372036854775807,9223372036854775807]

unsigned long long 的最小取值范围为[0,18446744073709551615]

用int类型首先考虑 unsigned 类型,这种类型的数常用于计数,unsigned 也可以表示更大的正数。

如果一个数超出了 int 类型的取值范围,且在 long 类型的取值范围内时,使用 long 类型。

long常量和long long常量:

如果数字超出了int可表示的最大值,编译器就会将其视为long int类型,如果超出了long可表示的最大值,编译器就会将其视为unsigned long类型,如果还不够大,编译器就会将其视为long long或unsigned long long类型。

八进制和十六进制常量被视为int类型,如果值太大,编译器就会使用unsigned int,如果还不够大,编译器会依次使用long,unsigned long,long long和unsigned long long类型。

要把一个较小的数作为long类型对待,可以在值的末尾加上l或L后缀,八进制和十六进制也适用l和L后缀。

在支持long long类型的系统中,也可以使用ll或LL后缀来表示long long类型的值

u或U后缀表示unsigned

整数超出了相应类型的取值范围:

#include <stdio.h>

int main(void)
{
int i = 2147483647;
unsigned int j = 4294967295; printf("%d %d %d\n", i, i+1, i+2);
printf("%d %d %d\n", j, j+1, j+2); return 0;
}

运行结果

在超过最大值时,unsigned int类型的变量j从0开始,而int类型的变量i从-2147483648开始

当i超出(溢出)其相应类型所能表达的最大值时,系统并未通知用户,需要自己注意这类问题

打印short、long、long long和unsigned类型:

打印unsigned int类型的值,使用%u转换说明

打印long类型的值,使用%ld转换说明

打印八进制long类型的值,使用%lo转换说明

打印十六进制long类型的值,使用%lx转换说明

虽然C语言允许使用大写或小写的常量后缀,但是在转换说明中只能用小写

对于short类型,使用h前缀

%hd表示打印十进制short类型的整数

%ho表示打印八进制short类型的整数

h和l前缀都可以和u一起使用,用于表示无符号类型

支持long long类型的系统,%lld和%llu分别表示有符号和无符号类型

#include <stdio.h>

int main(void)
{
unsigned int un = 3000000000;
short end = 200;
long big = 65537;
long long verybig = 12345678908642; printf("un = %u and not %d\n", un, un);
printf("end = %hd and %d\n", end, end);
printf("big = %ld and not %hd\n", big, big);
printf("verybig = %lld and not %ld\n", verybig, verybig); return 0;
}

运行结果

第1行输出,对于无符号变量un,使用%d会产生负值,因为无符号值3000000000和有符号值-1294967296在系统内存中的内部表示完全相同

在待打印的值大于有符号值的最大值时,会发生这种无符号和有符号所打印的值不同的情况

对于较小的正数,有符号和无符号类型的存储、显示都相同

第2行输出,对于short类型的变量end,在printf()中无论指定以short类型(%hd)还是int类型(%d)打印,打印出来的值都相同

这是因为在给函数传递参数的时候,C编译器把short类型的值自动转换成int类型的值

int类型被认为是计算机处理整数类型时最高效的类型

使用h修饰符的用处:使用h修饰符可以显示较大整数被截断成short类型值的情况

第3行输出,把65537以二进制格式写成一个32位是00000000000000010000000000000001,使用%hd,printf()只会查看后16位,所以显示的值是1

第4行输出,使用了%ld,printf()只显示了储存在后32位的值

char类型:

char类型用于储存字符,char也是整数类型,因为char类型实际上储存的是整数而不是字符,整数和字符通过ASCII码互相对应

C语言把字符常量视为int类型而不是char类型

一般来说,C语言会保证char类型足够大,以储存系统(实现C语言的系统)的基本字符集

C语言把1字节定义为char类型占用的位(bit)数

C语言允许在关键字char前面使用signed或unsigned,signed char表示有符号类型,unsigned char表示无符号类型,如果只用char处理字符,char前面不需要使用任何修饰符

有符号char可表示的范围为-128~127,无符号char可表示的范围为0~255

字符常量和初始化:

char grade = 'A';

或者

char grade = 65;

单引号括起来的是字符,双引号括起来的是字符串

非打印字符:

单引号只适用于字符、数字和标点符号,有些ASCII字符是打印不出来的

C语言中有3种方法打印这些字符:

第1种是用ASCII码

第2种是用特殊的符号序列表示一些特殊的字符,这些字符序列叫做转义序列

转义序列 含义
\a 警报
\b 退格
\f 换页
\n 换行
\r 回车
\t 水平制表符
\v 垂直制表符
\\ 反斜杠(\)
\' 单引号
\" 双引号
\? 问号
\0oo 八进制值(oo必须是有效的八进制数,即每个o可表示0~7中的一个数)
\xhh 十六进制(hh必须是有效的十六进制数,即每个h可表示0~f中的一个数)

如果要用八进制ASCII码表示一个字符,可以在编码值前面加一个反斜杠(\),并用单引号括起来

十进制、八进制、十六进制都可以表示字符常量

打印字符:

printf()函数用%c指明待打印的字符

一个字符变量被储存为1字节的整数值,所以可以用%d打印char类型的整数值

#include <stdio.h>

/*字符ASCII码*/
int main(void)
{
char ch = 'B'; printf("The code for %c is %d\n", ch, ch); return 0;
}

运行结果

_Bool类型:

_Bool类型用于表示布尔值,true和false

C语言中可以用1表示true,0表示false,所以_Bool类型也是一种整数类型

float、double、和long double:

C标准规定,float类型必须至少能表示6位有效数字,且取值范围至少是10-37~10+37

通常系统储存一个浮点数要占用32位,其中8位用于表示指数的值和符号,剩下24位用于表示非指数部分(也叫作尾数或有效数)及其符号

double类型和float类型的最小取值范围相同,但至少必须能表示10位有效数字,实际上double类型的值至少有13位有效数字

long double类型的精度比double类型更高,但C只保证long double类型至少与double类型的精度相同

浮点型常量:

浮点型常量的基本形式是:有符号的数字(包括小数点),后面紧跟e或E,最后一个是有符号数表示10的指数

可以没有小数点(如,2E5)或指数部分(如,19.28),但是不能同时省略两者

可以省略小数部分(如,3.E16)或整数部分(如,.45E-6),但是不能同时省略两者

不能在浮点型常量中间加空格,如156 E+12

默认情况下,编译器假定浮点型常量是double类型的精度

通常,4.0和2.0被储存为64位的double类型,使用双精度进行乘法运算,然后将乘积截断成float类型的宽度

在浮点数后面加上f或F后缀可覆盖默认设置,编译器会将浮点型常量看作float类型,如2.3f和9.11E9F

使用l或L后缀使得数字成为long double类型,没有后缀的浮点型常量是double类型

打印浮点值:

printf()函数使用%f转换说明打印十进制记数法的float和double类型浮点数

用%e打印指数记数法的浮点数

如果系统支持用十六进制格式的浮点数,可用a和A分别代替e和E

用%Lf,%Le,%La打印long double类型

浮点值的上溢和下溢:

float toobig = 3.4E38 * 100.0f;
printf("%e\n", toobig);

当计算导致数字过大,超过当前类型能表达的范围时,就会发生上溢

在这种情况下会给toobig赋一个表示无穷大的特定值,而且printf()显示该值为int或infinity(或者具有无穷含义的其他内容)

在计算过程中损失了原末尾有效位数上的数字,这种情况叫做下溢

C语言把损失了类型全精度的浮点值称为低于正常的浮点值

因此,把最小的正浮点数除以2将得到一个低于正常的值,如果除以一个非常大的值,会导致所有的位都为0

如果传入的值超出了函数规定的范围,函数将返回NaN值

复数和虚数类型:

C语言的3种复数类型:float _Complex,double _Complex和long double _Complex

C语言的3种虚数类型:float _Imaginary,double _Imaginary和long double _Imaginary

如果包含complex.h头文件,就可以用complex代替_Complex,用imaginary代替_Imaginary

类型大小:

sizeof是C语言的内置运算符,以字节为单位给出指定类型的大小

C99和C11提供%zd转换说明匹配sizeof的返回类型,一些不支持C99和C11的编译器可用%u或%lu代替%zd转换说明匹配sizeof的返回类型

在char类型为16位,double类型为64位的系统中,sizeof给出的double是4字节

运算对象是类型时,圆括号不能少,如,sizeof(char),但是对于特定量,可有可无,如sizeof name,sizeof 6.28

在limits.h和float.h头文件中有类型限制的相关信息

使用数据类型:

把一个类型的数值初始化给不同类型的变量时,编译器会把值转换成与变量匹配的类型,这将导致部分数据丢失

C编译器把浮点数转换成整数时,会直接丢弃(截断)小数部分,而不进行四舍五入

C只保证了float类型前6位的精度

刷新输出:

printf()语句把输出发送到一个叫做缓冲区的中间存储区域,然后缓冲区中的内容再不断被发送到屏幕上

C标准明确规定了何时把缓冲区中的内容发送到屏幕:当缓冲区满、遇到换行字符或需要输入的时候(从缓冲区把数据发送到屏幕或文件被称为刷新缓冲区)

C Primer Plus学习笔记(二)- 数据和C的更多相关文章

  1. C Primer Plus学习笔记(二)

    1. C的左值用是指用于标志一个特定的数据对象的名字或表达式.“数据对象”是泛指数据存储的术语. 赋值运算符的左边应该是以个可以修改的左值. 右值是指可赋给可修gia的左值的量.右值可以是常量.变量或 ...

  2. Spring.Net学习笔记(二)-数据访问器

    Spring对ADO.NET也提供了支持,依赖与程序集Spring.Data.dll IDbProvider IDbProvider定义了数据访问提供器的基础,配置如下 <?xml versio ...

  3. openresty 学习笔记二:获取请求数据

    openresty 学习笔记二:获取请求数据 openresty 获取POST或者GET的请求参数.这个是要用openresty 做接口必须要做的事情.这里分几种类型:GET,POST(urlenco ...

  4. WPF的Binding学习笔记(二)

    原文: http://www.cnblogs.com/pasoraku/archive/2012/10/25/2738428.htmlWPF的Binding学习笔记(二) 上次学了点点Binding的 ...

  5. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  6. [Firefly引擎][学习笔记二][已完结]卡牌游戏开发模型的设计

    源地址:http://bbs.9miao.com/thread-44603-1-1.html 在此补充一下Socket的验证机制:socket登陆验证.会采用session会话超时的机制做心跳接口验证 ...

  7. Windows phone 8 学习笔记(2) 数据文件操作

    原文:Windows phone 8 学习笔记(2) 数据文件操作 Windows phone 8 应用用于数据文件存储访问的位置仅仅限于安装文件夹.本地文件夹(独立存储空间).媒体库和SD卡四个地方 ...

  8. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  9. 《SQL必知必会》学习笔记二)

    <SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...

  10. NumPy学习笔记 二

    NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...

随机推荐

  1. 如何用Spring框架的<form:form>标签实现REST风格的增删改查操作

    1.首先创建两个bean类,Employee(职工)和Department(部门),一个部门可以有多个职工 Employee类(属性:职工ID:id:姓名:lastName:邮箱:email:性别:g ...

  2. POJ 1015 Jury Compromise(dp坑)

    提议:在遥远的国家佛罗布尼亚,嫌犯是否有罪,须由陪审团决定.陪审团是由法官从公众中挑选的.先随机挑选n个人作为陪审团的候选人,然后再从这n个人中选m人组成陪审团.选m人的办法是:控方和辩方会根据对候选 ...

  3. poj 1061 青蛙的约会 扩展欧几里德

    青蛙的约会 Time Limit: 1000MS   Memory Limit: 10000K       Description 两 只青蛙在网上相识了,它们聊得很开心,于是觉得很有必要见一面.它们 ...

  4. 编写高质量代码——html、css、javascript

    [编写高质量代码]1.注释的必要性:增加代码的可读性.2.web标准:由一系列的标准组合而成,其核心理念是将网页的结构.样式.行为分离,所以他可分为:结构标准.样式标准和行为标准.3.一个符合标准的网 ...

  5. 图片文件和Bitmap之间的转换

    图片文件转为Bitmap对象String filePath="c:/01.jpg";  Bitmap bitmap=BitmapFactory.decodeFile(filePat ...

  6. RequireJs 源码解读及思考

    写在前面: 最近做的一个项目,用的require和backbone,对两者的使用已经很熟悉了,但是一直都有好奇他们怎么实现的,一直寻思着读读源码.现在项目结束,终于有机会好好研究一下. 本文重要解读r ...

  7. 14_ Component 游戏开发组件模式

    # component 不同作用的程序需要保持互相隔离 我们不想ai 物理 渲染 声音 等等功能 耦合在一起,像下面这样 ``` //bad if (collidingWithFloor() & ...

  8. PHP Smarty无法解析模板文件

    /****************************************************************************** * PHP Smarty无法解析模板文件 ...

  9. OpenCV - opencv3 图像处理 之 图像缩放( python与c++实现 )

    转自:https://www.cnblogs.com/dyufei/p/8205121.html 一. 主要函数介绍 1) 图像大小变换 cvResize () 原型: voidcvResize(co ...

  10. 前端调错看ajax请求操作

    ---------------------------------------------------------------------------------------------------- ...