二.数据和C

1.示例程序


#include<stdio.h>

int main(void)

{

float weight;

float value;

printf("Are you worth your weight in platnum?\n");

printf("Let's check it out.\n");

printf("Please enter you weight in pounds:");

//获取用户输入

scanf_s("%f", &weight);

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

value = 1700 * weight * 14.5833;

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

printf("you are easily worth that! if platinum prices drop,\n");

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

return 0;

}

scanf()函数是标准C中提供的标准输入函数,用以用户输入数据scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s()。在调用该函数输入字符串时,必须提供一个数字以表明最多读取多少位字符。

原因和区别:

scanf()在读取数据时不检查边界,所以可能会造成内存访问越界:

//例如:分配了5字节的空间但是用户输入了10字节,就会导致scanf()读到10个字节char buf[5]={’\0’};scanf("%s", buf);//如果输入1234567890,则5以后的部分会被写到别的变量所在的空间上去,从而可能会导致程序运行异常。以上代码如果用scanf_s()则可避免此问题:

char buf[5]={’\0’};scanf_s("%s",buf,5); //最多读取4个字符,因为buf[4]要放’\0’//如果输入1234567890,则buf只会接受前4个字符注: scanf_s最后一个参数n是接收缓冲区的大小(即buf的容量),表示最多读取n-1个字符

%f处理浮点数字。

在%.2f中的 .2 用于精确控制输出,指定输出的浮点数只显示小数点后面 2 位

&weight 高数 scanf_s把输入和输出值赋给名为 weight 的变量。scanf_s函数使用&符号表明找到 weight变量地点。

2.变量与常量数据


3数据:数据类型关键字


1.int表示整型

long, short, 和 unsigned 和C90新增的 signed 用于提供基本整数类型的变式,例如 long long int, unsigned short int

2.char 用于指定字母和其他字符(如,#,$,%和*),另外char也可以表示较小的整数

3.float, double, long double 表示带小数点的数。

4._Bool 类型表示布尔值

5._Complex 和 _Imaginary 分别表示复数和虚数

计算机储存总共可以分为两大基本类型:整数类型和浮点类型

整数

浮点数

3.16E7表示3.16*10的七次方

Ⅰint 类型


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

程序演示int类型打印:

#include<stdio.h>

int main(void)

{

int ten = 10;

int two = 2;

printf("doing it right:\n");

printf("%d minus %d is %d\n", ten, 2, ten - two);

printf("doing it wrong:\n");

printf("%d minus %d is %d", ten);

return 0;

}

说明:最终打印结果如下

其中第二行由于只有第一个 %d对应了 ten 变量,而第二个第三个 %d 没有提供任意值,所以打印出的是内存中的任意值。

在打印中使用转换说明要注意,转换说明的数量要和待打印值的数量相等;

②十六进制和八进制

0X & 0x 为前缀表示十六进制,

0 为前缀表示八进制

③显示十六进制和八进制

以十进制显示数字使用 %d 以十六进制显示数字使用 %x 以八进制显示数字使用 %o

要显示各进制数的前坠 0, 0x, 0X,必须分别使用 %#0, %#x, %#X。

实例程序:

#include<stdio.h>

int main(void)

{

int x = 100;

printf("dec = %d, octal = %o, hex = %x \n");

printf("dec = %d, octal = %#o, hex = %#x");

return 0;

}

输出为:

④其他整数类型

当正整数到达他所能表示最大值时,会重新从起点开始,对于int i 当超过最大值时会从 -27147483648开始

⑤打印short, long, long long 和 unsigned 类型

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

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

打印 short 类型的值,使用h前坠,注意 h, l 前缀都可以和 u 一起使用,用于表示无符号类型;

#include<stdio.h>

int main(void)

{

unsigned int un = 3000000000;//int 为 32位和short为16位的系统

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;

}

输出为:

第一句说明,无符号数3000000000 和有符号数-1294967296 存放在系统同一位置,但是对于较小的正数,例如96 无符号和有符号类型的存储显示都相同。

C编译器会把 short 类型的值转换成 int 类型的值:

为什么要转换? h 修饰符有什么用?

<问题1>int 类型 被认为是计算机处理整数类型时最高效的类型

<问题2>使用 h 修饰符可以显示较大整数被截断成 short 类型值的情况

例如第三行中将 long 65337 写成二进制后,使用 %hd printf()只会查看后16位,所以显示值为一。

Ⅱ使用字符:char 类型


char 类型常用于储存字符,但是从技术层面上来看,char是整数类型。因为 char 类型实质上储存的是整数而不是字符(ASCⅡ编码)

若在printf()函数中打印ASKⅡ表则需要使用"/x"的形式

char占用位数为 1

②声明 char 类型变量

③字符常量和初始化

例如:

char a = '1';

int 对应32字节,而 char 对应1字节,如果定义一个字符常量 ‘FATE’ ,即把4个独立的8位ASCⅡ嘛储存在一个32位存储单元中,如果将其付给 char 类型 的变量,那么只有最后八位有效,即最终输出为 'E'

#include<stdio.h>

int main(void)

{

char ch;

printf("Please enter a character.\n");

scanf("%c", &ch);//用户输入字符

printf("The code for %c is %d.\n");

return 0;

}

证明了字符显示方式,存储方式依旧是一个二进制数

Ⅲ_Bool类型


C语言中,true 用值1表示, false 用值0表示。

所以_Bool类型实际上也是一种证书类型,但原则上他只占用一位存储空间,对0,1而言一位已经足够

Ⅳ可移植类型:stdint.h 和 inttypes.h


Ⅴ float, double 和 long double


①浮点数的表示时指数计数法(或e计数法),是科学计数法在计算机中的写法。

float 类型必须至少能表示6位有效数字(注意不是精确到小数点后六位,时保存前六位)

且取值范围至少是10的-37次方到10的+37次方。

系统存储一个浮点数要占用32位,其中八位用于表示指数的值和符号,剩下的24位用来表示非指数部分机及其符号。

②double

double意味双精度,double类型和float类型的最小取值范围相同,但至少必须能表示10位有效数字。

一般情况下,double占据64位而不是32位。

③long double

满足比double更高精度的需求。(c只保证 long double 的类型 至少与double类型的精度相同)

浮点类型常量:

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

-1.53E + 12

2.87e - 3

注意:正号可以省略,可以没有小数点或指数部分,但是不能同时省略两者。可以省略小数部分,或整数部分,但是不能同时省略两者

不要在浮点类型常量中间加空格,例如:1.56 E + 12

编译器默认浮点数存储位double,应当显示说明,如:2.3f,5.4F,

使用 L 或 l 使得数字成为 long double 类型:54.32l,58.22L(建议使用大写L防止混淆)

打印浮点值

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

用 %e 打印指数计数法的浮点数,如果支持16进制格式的浮点数,可以使用 a 和 A 代替 e 和 E

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

注意:未那些位在函数原型中显示说明参数类型的函数(如printf())传递参数时,C编译器会把float类型的值自动转化为double类型。

#include<stdio.h>

int main(void)

{

float aboat = 32000.0;

double abet = 2.14e9;

long double dip = 5.32e-5;

printf("%f can be written %e\n", aboat, aboat);

printf("And it's %a in hexadecimal, power of 2 notation\n", aboat);

printf("%f can be written %e\n", abet, abet);

printf("%Lf can be witten %Le\n", dip, dip);

return 0;

}

浮点值的上溢和下溢

上溢:当计算导致数字过大,超过当前类型所能表达的范围时,就会发生上溢。会给toobig赋一个表示无穷大的特定值。printf显示该值为 inf 或者 infinity.

下溢:得到了结果却损失了元末为有效位上的数字称为下溢,C语言将损失了类型的全精度的浮点值称为低于正常的浮点值。因此将最小的政府点数除以二将会得到一个低于正常的值,如果初一一个非常大的值,会导致所有位都为0.

还有一个特殊浮点值NaN(not a number)

浮点数舍入错误

#include<stdio.h>

int main(void)

{

//给定一个数,加上1再减去原来的数,浮点运算会给出不同答案

/*演示舍入错误*/

float a, b;

b = 2.0e20 + 1.0;

a = b - 2.0e20;

printf("%f\n", a);

return 0;

}

原因是,计算机没有足够的小数位来完成正确的运算。

复数和虚数类型

C语言有3中复数类型:float_Complex, double_Complex, long_Complex 例如:float_Complex 值应该包含两个float,一个表示实数,一个表示虚数。

三种虚数类型:float_Imaginary, double_Imaginary, long double_Imaginary

如果包含了complex.h 头文件,便可使用 complex 代替 _Complex 用imaginary 代替 _Imaginary,还可以用 I 代替 -1 的平方根

其他类型

总结


int:

系统给定的基本整型。C语言规定int类型不小于16位。

short 或 short int:

最大的short类型整数小于或等于最大的 int 类型整数,C语言规定shirt类型至少占16位

long 或 long int:

该类型可表示的整数大于或等于最大的 int 类型整数。C语言规定long类型至少占32位

long long 或 long long int:

该类型课表示的整数大于或等于最大的 long 类型整数。long long 类型至少占 64 位

无符号整型:

无符号整型只能用于表示0和正整数,因此无符号整型可以表示的正整数比有符号整型的大(unsigned 和 signed 都是 C 语言中的数据类型修饰符,它们的主要区别在于它们可以表示的数值范围和表示方式。 unsigned 类型表示非负整数,其取值范围为 0 到 2^n-1(n 为该类型的位数),例如 unsigned char 可以表示 0 到 255 之间的值。unsigned 类型的存储方式是二进制补码。 signed 类型表示有符号整数,其取值范围为 -2^(n-1) 到 2^(n-1)-1,例如 signed char 可以表示 -128 到 127 之间的值。signed 类型的存储方式也是二进制补码。 因此,unsigned 和 signed 数据类型的区别在于它们的表示范围和存储方式。在使用时,需要根据具体的需求选择合适的数据类型。如果数值是非负的,可以使用 unsigned 数据类型,否则需要使用 signed 数据类型。

在整型类型前加上关键字, unsigned 表明该类型是无符号整型:unsigned int, unsigned long, unsigned short.单独的 unsigned相当于 unsigned int.

字符类型:

char:可以打印出来的符号又是字符。char类型表示一个字符要占用1字节内存(区分JAVA需要2字节)出于历史原因一字节通常是8位,但是如果要表示基本字符集,也可以是16位或者更大。

布尔类型:

布尔值表示true 和 false。C语言用 1 表示true,用 0 表示 false

_Bool——布尔类型关键字,布尔类型是无符号的 int 类型, 所占用的空间值要能存储 0 或 1 即可

实浮点类型:

实浮点类型可表示正浮点数和负浮点数。

float——系统基本的浮点类型,课精确表示至少有6位有效数字。

double——储存浮点数的范围(可能)更大,能表示比float类型更多的有效数字(至少10位,通常会更多)和更大的指数。

long double——储存浮点数的范围(可能)比double大,能表示比1 double 类型更多的有效数字和更大的指数。

复数和虚数浮点数

Ⅵ类型大小:


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

Ⅶ使用数据类型


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

int cost = 12.99;——这里将会直接截断小数部分,而不会进行四舍五入,(注意区别和JAVA的强制类型转换)

float pi = 3.1415926536;——这里将会损失一些精度,C只保证了float类型前6位的精度。

注意,用%d i按时float 类型的值,其值不会被转换为int类型。在不同平台下,缺少参数,或参数类型不匹配导致的结果不同。

Ⅷ转义字符

\b:退格

\t:制表符

\r:回车

\n:换行

Ⅸ刷新缓冲区

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

当缓冲区满,遇到换行字符或需要输出的时候(从缓冲区把数据发送到屏幕或文件被称为刷新缓冲区)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Benaso

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值