02-数据和C

0x00 示例程序

 
//platinum.c -- your weight in platinum

#include <stdio.h>

int main(void)

{

float weight; /*你的体重*/

float value; /*相等体重的白金价值*/

printf(“Are you worth your weight in platinum?\n”);

printf(“Let’s check it out.\n”);

printf(“Please enter your weight in pounds: ”);

/*获取用户的输入*/

scanf(“%f”, &weight);

/*假设白金的价格是每盎司$1700*/

/*14.5833用于把英镑常衡盎司转换为金衡盎司*/

value = 1700.0 * weight * 14.5833;

printf(“Your weight in platinum is worth $%.2f.\n”, value);

pirntf(“You are easily worth that! if platinum prices drop,\n”);

printf(“eat more to maintain your value.\n”);

return 0;

}
  • 提示错误与警告:如漏了一个分号,编译器会报告语法错误消息.从double类型转换成为float类型可能会丢失数据的警告.错误消息表明程序中有错,不能进行编译.而警告则表明程序可能不是程序员想要的那样.警告并不终止编译.
  • scanf获取到用户输入Enter或Return键之前的值,如果是字母会导致程序出问题.输入值之后在windows一闪而过用两次getchar()可以不让程序退出:第一次获取到的是Enter或Returen,getchar()函数读取下一个输入字符
  • 程序中的新元素:浮点数类型(float)的变量,以便处理更大范围的数据,float类型可以存储带小数的数字,为了打印新类型的变量,在printf()中使用%f来处理浮点数值.%.2f中的”.2f”用于精确控制输出,指定输出的浮点数只现实小数点后面两位.
  • scanf()函数用于读取键盘的输入,%f说明scanf()要读取用户从键盘输入的浮点数,&weight告诉scanf()把输入的值赋给名为weight的变量.scanf()函数使用&符号找到weight变量的地址
  • scanf()和printf()函数用于实现这种交互.scanf()函数读取用户从键盘输入的数据,并把数据传递给程序.printf()函数读取程序中的数据,并把数据显示在屏幕上.把两个函数结合起来,就可以建立人机双向通信.

0x01 变量与常量数据概念

  • 常量数据:在程序使用之前已经预先设定好了,在整个程序的运行期间过程没有变化
  • 变量数据:在程序运行期间可能会改变或被赋值

0x02 数据类型关键字

  • K&C给出了7个与类型相关的关键字:int long short unsigned char float double
  • C90标准增加的关键字:signed void
  • C99标准添加的关键字:_Bool _Complex _Imaginary

在C语言中,用int关键字来表示基本的数据类型.后3个关键字(long丶short和unsigned)和C90新增的signed用于提供基本数据类型的变式,如:unsigned short int和long long int.char关键字用于指定字母和其他字符(#丶$丶%丶*),char类型也可以表示较小的整数.float丶double和long double 表示带小数点的数._Bool类型表示布尔值(true或flase),_complex和_Imaginary分别表示复书和虚数.通过这些关键字创建的类型,按计算机的存储方式可分为两大基本类型:整数和浮点类型

位丶字节和字是描述计算机数据但愿或存储单元的术语.

  • 最小的存储单元是位(bit),可以存储0或1,位是计算机内存的基本构建块.
  • 8位组成一个字节,是常用的计算机存储单位.
  • 字是设计计算机时给定的自然存储单位.8位的微型计算机1个字长只有8位.增长至16位丶32位,直到目前的64.计算机的字长越大,其数据转移越快,允许的内存访问也更多
  • 和数学的概念一样,在C语言中,整数是没有小数部分的数.计算机以二进制数字储存整数,例如,整数5以二进制写是101.因此,要在8位字节中储存该数字,需要把前5位都设置成0,然后把后三位设置成101.
  • 浮点数与数学中实数概念差不多.2.75丶3.16E7丶7.00和2e-8都是浮点数.在一个值后面加上一个小数点,该值就成为一个浮点数.7是整数,7.00是浮点数.3.16E7表示3.16*10^7,其中10^7=10000000,7被称为10的指数.
  • 整数和浮点数的区别:整数没有小数部分,浮点数有小数部分.浮点数可以表示的范围比整数大,对于一些算术运算,浮点数损失的精度更多.浮点数通常只是实际值的近似值.7.0可能被储存为浮点值6.99999

0x03 C语言基本数据类型

C语言中的整数类型可表示不同的取值范围和正负值.int类型是有符号整数,即int类型的值必须是整数,可以是正整数丶负整数或零.ISO C规定int的取值范围最小为-32768~32767.

  • 声明int变量:先写上int,然后写变量名,最后加上一个分号.要声明多个变量,可以单独声明每个变量,也可以在int后面列出多个变量名,变量名之间用逗号分割.
  • 声明变量之后赋值,通过函数赋值,初始化赋值
  • 0x或者0X前缀表示十六进制值,0前缀表示八进制,0b表示二进制.无论使用何种方式,在计算机内部都以二进制进行编码
  • 八进制显示用%o,十六进制显示用%x.显示前缀增加#
  • 附属关键字修饰基本数据类型:short丶long和unsigned
  • 整数溢出时,像钟表一样从起点到终点的循环.
  • 打印unsigned int类型的值使用%u转换,打印long int类型的值使用%ld转换.%lx表示以十六进制格式打印long类型整数,%lo表示以八进制格式打印long类型整数.%hd表示以十进制显示short类型的整数,%ho表示以八进制显示short类型的整数.h和l前缀都可以和u一起使用,用于表示无符号类型.%lu表示打印unsigned long int类型.%lld和%lld分别表示有符号和无符号类型
  • 使用错误的转换说明会得到意想不到的结果,无符号数和有符号数重叠,高位数截断成低位数
  • 在使用printf()函数时,切记检查每个待打印值都有对的转换说明,检查转换说明的类型时候与待打印值的类型相匹配
  • char类型用于储存字符,char类型实际上储存的是整数而不是字符.char占用1字节
  • 字符常量和初始化,char tmp = ‘A’; 在C语言中用单引号过气来的单个字符被称为字符常量,编译器发现’A’就会将其转换成相应的代码值.可以把一个字符常量’ABCD’赋值给char类型变量,但结果为’D’.
  • 非打印字符直接用数字常量赋值或者用转移序列赋值,char tmp = ‘\n’; 还可以用八进制和二进制表示.警报声音不会改变光标的活跃位置

  • char类型前面使用signed或unsigned,无论什么编译器默认是什么,signed char表示有符号类型,unsigned char表示无符号类型.用char类型处理小整数时很有用.
  • _Bool类型用于表示布尔值,即逻辑值true和false.C语言用1表示true,0表示false.占一位存储空间
  • 在stdint.h头文件中,int32_t表示32位有符号整数类型,在使用32位int的系统中,头文件把int32_作为int的别名.类型别名是精确宽度整数类型的示例.最小宽度类型:int_least8_t是可容纳8位有符号整数值的类型中宽度最小的类型的一个别名.最快最小宽度类型:int_fast8_t:系统中对8位有符号值而言运算最快的整数类的别名。最大整数类型:intmax_t,可储存任何有效的有符号整数值。unitmax_t表示最大的无符号整数类型。
  • inttypes.h头文件定义了PRId32字符串宏,代表打印32位有符号值的合适转换说明
  • float丶double和long double类型表示类似于科学计数法,即用小数乘以10的幕来表示数字。float类型必须至少能表示6位有效小数字,且取值范围至少是10^-37~10^+37。C语言提供的另一种浮点类型是double,double类型和float类型的最小取值范围相同,但至少必须能表示10位有效小数,double类型的值至少有13位有效数字,超过了标准的最低位数规定。long double类型至少与double类型的精度相同。默认情况下,编译器假定浮点型常量是double类型的精度。C99标准添加了一种心的浮点型常量格式-用十六进制表示浮点型常量,即在十六进制数前加上十六进制前缀0x或者0X,用p和P分别代替e和E,用2的幕代替10的幕。
  • 打印浮点值,用%f打印十进制计数法的float和double类型浮点数。用%e打印指数计数法的浮点数,十六进制计数法,a和A分别代替e和E。打印long double类型要使用%Lf、%Le或%La转换说明
  • 浮点值的上溢和下溢:假设系统的最大float类型值是3.4E38,3.4E38 * 100.f会得到一个表示无穷大的特定值,printf()显示该值为inf或者infinity

  • 当除以一个很小的数时,如0.1234E^-10除以10,得到的结果是0.0123E^-10。得到了结果但是损失了原末尾有效位上的数字,这种情况叫下溢。把最小的正浮点数除以2将得到一个低于正常的值,如果除以一个非常大的值,会导致所有的位都为0。NaN是一个特殊的浮点值,给asin()传递参数大于1。
  • C语言有3种复数类型:float_Complex、double_Complex和long double _Complex。3种虚数类型是:float _Imaginary、double_Imaginary和long double _Imaginary。使用complex.h头文件可以用complex和imaginary代替_Complex和_Imaginary,还可以用I代替-1的平方根
  • fflush()函数刷新缓冲区
0 条评论
发表一条评论