数据和C
c语言的数据类型关键字
最初 c90添加 c99添加
char signed -Bool
int void -Complex
short -Imaginary
long
unsigned
float
double
int类型
有符号整型,值是整数,正整数,负整数或0.
int最小取值范围为-32768–32767
声明int变量:int erns; int cows;
声明创建了变量,如何获得值?
1,赋值 cows=112;
2,通过函数获得(如scanf()获得)
3,初始化变量
C语言中,初始化可以直接在声明中完成。
int hogs=21; int cow=32;
八进制和十六进制
在C语言中,用特定的前缀表示使用哪种进制。
0x和0X表示十六进制值,如16表示成0x10或0X10。
o前缀表示八进制,如16表示成o20。
显示八进制和十六进制。 (转换说明)
以十进制,使用%d.八进制,使用%o.十六进制,使用 %x.
若要显示前缀,用%#o, %#x。
打印short,long,long long 和unsigned
unsigned int 使用%u
long,使用%ld
若系统中int 和long大小相同,使用%d就行。
%lx是十六进制格式打印long类型,%lo表示八进制long类型。
short类型用 %hd %ho。
char 类型
用于存储字符(字母或标点符号),从技术层面看,char是整数类型。
1,声明char 类型变量。
与其他相同 eg: char ch;
2,字符常量和初始化
eg:char grade='A';
用单引号括起来的单个字符称为“字符常量”,单引号叫定界符。
3,非打印字符
单引号只适用于字符,数字和标点符号。
C语言提供以下方法表示这些代表行为的字符
第一,ASCII码。
如,蜂鸣字符的ASCII码值是7. char beep=7;
第二,使用转义序列
把转义序列字符赋给字符变量时,必须用单引号把转义序列括起来
char nerf=’\n’;
常用的转义序列
\a-警报 \b-退格 \f-换页 \n-换行 \r-回车 \t-水平制表符 \v-垂直制表符
\-反斜杠(\) '-单引号 "-双引号 ?-问号 \o00八进制值 \xhh-十六进制
4,非打印字符
printf()函数用%c指明待打印的字符。
一个字符变量实际上被存储为1字节的整数值。因此,如果用%d转换说明打印char类型变量的值,打印的是一个整数。而%c转换说明告诉printf()打印该整数对应的字符。
5,有符号还是无符号
有些C编译器把char实现为有符号类型,意味着char可表示的范围是 -128~127。而无符号char表示的范围为0 ~ 255。
_Bool类型
即逻辑值 true and false. 1代表true,0 代表false,原则上只占用一位存储空间。
float, double和 long double
面向金融和数学的程序经常使用浮点数。
C标准规定,float类型必须至少能表示6位有效数字。例如,33.333333的前六位数字,而不是精确到小数点后六位数字。通常,系统存储一个浮点数要占用32位,其中8位用于表示指数的值和符号,剩下的24位用于表示非指数部分及其符号。
C语言提供的另一种浮点类型是double(意为双精度)。一般情况,double占64位。double类型的值至少必须有10位有效数字。
long double : C只保证long double 类型至少与double 类型的精度相同。
1,声明浮点型变量
与整型变量相同。
float num, sum;
double trouble;
float sec = 6.63e-34;
long double gnp;
2,浮点型常量
基本形式是:有符号的数字(包括小数点),后面紧跟e或E,最后是一个有符号数表示10的指数。
如:-1.6E+12 2.56e-3
正号可以省略。可以没有小数点(如2E5)或指数部分(如13.56),但是不能同时省略两者。可以省略小数部分(如3.E18)或整数部分(如, .45E-4),但是不能同时省略两者。
不要在浮点型常量中间加空格: 1.56 E+12(错误!)。
C99标准添加了一种新的浮点型常量格式-----用十六进制表示。
即在十六进制数前加上十六进制前缀(0x或0X),用p和P分别代替e和E,用2的幂代替10的幂(即,p计数法)。
如:0xa.1fp10
3,打印浮点值
printf()用 %f 打印十进制计数法的float和double类型浮点数, 用 %e 打印指数计数法的浮点数。
类型大小
sizeof 是C语言的内置运算符,以字节为单位给出指定类型大小。C99和C11提供%zd转换说明匹配sizeof的返回类型(即siz_t类型)。一些不支持C99和C11的编译器可用%u或%lu代替%zd.
/*打印类型大小*/
#include<stdio.h>
int main(void)
{
printf("Type int has a size of %zd bytes.\n", sizeof(int));
printf("Type char has a size of %zd bytes.\n", sizeof(char));
printf("Type long has a size of %zd bytes.\n", sizeof(long));
printf("Type long long has a size of %zd bytes.\n", sizeof(long long));
printf("Type double has a size of %zd bytes.\n", sizeof(double));
printf("Type long double has a size of %zd bytes.\n", sizeof(long double));
return 0;
}
使用数据类型
编写程序时,应注意合理选择所需变量及类型。使用变量前必须先声明,并选择有意义的变量名。初始化变量应使用与变量类型相匹配的常数类型。
例如:
int apples = 3;
float pi = 3.141592653f;
把一个类型的数值初始化给不同类型的变量时,编译器会把值转换成与变量匹配的类型,这将导致部分数据丢失。例如:
int cost = 12.99 ;
float pi = 3.1415926535;
第一个声明,cost的值是12,丢弃了(截断)小数部分,不进行四舍五入。
第二个声明会损失一些精度,因为C只保证了float类型前6位的精度。
//Done!