C语言C语言数据类型

C语言数据类型

原文:http://zhidao.baidu.com/question/116383335.html?an=0&si=1

 

C语言各种数据类型及其在系统中占的字节和取值范围2009-08-21 09:53C语言包含5个基本数据类型: void, int, float, double, 和 char. 
(另:C++ 定义了另外两个基本数据类型: bool 和 wchar_t. 
一些基本数据类型能够被 signed, unsigned, short, 和 long 修饰
所以short,long等等都不算基本数据类型。
这是书上说的,所以C++是7种基本数据类型。

空值型是一种,但枚举型不算。原因就是枚举型可分的,所以不够基本。

不过不同的书也有不同的规定,比如C++Primer上就说是bool,char,wchar_t,short,int,long,float,double,long double和void,这个暂时没有定论。)

============================================================

基本类型包括字节型(char)、整型(int)和浮点型(float/double)。

定义基本类型变量时,可以使用符号属性signed、unsigned(对于char、int),和长度属性short、long(对

于int、double)对变量的取值区间和精度进行说明。

下面列举了Dev-C++下基本类型所占位数和取值范围:

符号属性 长度属性 基本型 所占位数 取值范围 输入符举例 输出符举例

    -- -- char                            8 -2^7 ~ 2^7-1 %c %c、%d、%u

    signed -- char                    8 -2^7 ~ 2^7-1 %c %c、%d、%u

    unsigned -- char                8 0 ~ 2^8-1 %c %c、%d、%u

    [signed] short [int]            16 -2^15 ~ 2^15-1 %hd

    unsigned short [int]           16 0 ~ 2^16-1 %hu、%ho、%hx

    [signed] -- int                    32 -2^31 ~ 2^31-1 %d

    unsigned -- [int]                 32 0 ~ 2^32-1 %u、%o、%x

    [signed] long [int]              32 -2^31 ~ 2^31-1 %ld

    unsigned long [int]             32 0 ~ 2^32-1 %lu、%lo、%lx

    [signed] long long [int]       64 -2^63 ~ 2^63-1 %I64d

    unsigned long long [int]      64 0 ~ 2^64-1 %I64u、%I64o、%I64x

    -- -- float                            32 +/- 3.40282e+038 %f、%e、%g

    -- -- double                        64 +/- 1.79769e+308 %lf、%le、%lg %f、%e、%g

    -- long double                    96 +/- 1.79769e+308 %Lf、%Le、%Lg

几点说明:

1. 注意! 表中的每一行,代表一种基本类型。“[]”代表可省略。

    例如:char、signed char、unsigned char是三种互不相同的类型;

    int、short、long也是三种互不相同的类型。

    可以使用C++的函数重载特性进行验证,如:

    void Func(char ch) {}

    void Func(signed char ch) {}

    void Func(unsigned char ch) {}

    是三个不同的函数。

2. char/signed char/unsigned char型数据长度为1字节;

    char为有符号型,但与signed char是不同的类型。

    注意! 并不是所有编译器都这样处理,char型数据长度不一定为1字节,char也不一定为有符号型。

3. 将char/signed char转换为int时,会对最高符号位1进行扩展,从而造成运算问题。

    所以,如果要处理的数据中存在字节值大于127的情况,使用unsigned char较为妥当。

    程序中若涉及位运算,也应该使用unsigned型变量。

4. char/signed char/unsigned char输出时,使用格式符%c(按字符方式);

    或使用%d、%u、%x/%X、%o,按整数方式输出;

    输入时,应使用%c,若使用整数方式,Dev-C++会给出警告,不建议这样使用。

5. int的长度,是16位还是32位,与编译器字长有关。

    16位编译器(如TC使用的编译器)下,int为16位;32位编译器(如VC使用的编译器cl.exe)下,int为32

    位。

6. 整型数据可以使用%d(有符号10进制)、%o(无符号8进制)或%x/%X(无符号16进制)方式输入输出。

    而格式符%u,表示unsigned,即无符号10进制方式。

7. 整型前缀h表示short,l表示long。

    输入输出short/unsigned short时,不建议直接使用int的格式符%d/%u等,要加前缀h。

    这个习惯性错误,来源于TC。TC下,int的长度和默认符号属性,都与short一致,

    于是就把这两种类型当成是相同的,都用int方式进行输入输出。

8. 关于long long类型的输入输出:

    "%lld"和"%llu"是linux下gcc/g++用于long long int类型(64 bits)输入输出的格式符。

    而"%I64d"和"%I64u"则是Microsoft VC++库里用于输入输出__int64类型的格式说明。

    Dev-C++使用的编译器是Mingw32,Mingw32是x86-win32 gcc子项目之一,编译器核心还是linux下的gcc。

    进行函数参数类型检查的是在编译阶段,gcc编译器对格式字符串进行检查,显然它不认得"%I64d",

    所以将给出警告“unknown conversion type character `I' in format”。对于"%lld"和"%llu",gcc理

    所当然地接受了。

    Mingw32在编译期间使用gcc的规则检查语法,在连接和运行时使用的却是Microsoft库。

    这个库里的printf和scanf函数当然不认识linux gcc下"%lld"和"%llu",但对"%I64d"和"%I64u",它则是

    乐意接受,并能正常工作的。

9. 浮点型数据输入时可使用%f、%e/%E或%g/%G,scanf会根据输入数据形式,自动处理。

    输出时可使用%f(普通方式)、%e/%E(指数方式)或%g/%G(自动选择)。

10. 浮点参数压栈的规则:float(4 字节)类型扩展成double(8 字节)入栈。

    所以在输入时,需要区分float(%f)与double(%lf),而在输出时,用%f即可。

    printf函数将按照double型的规则对压入堆栈的float(已扩展成double)和double型数据进行输出。

    如果在输出时指定%lf格式符,gcc/mingw32编译器将给出一个警告。

11. Dev-C++(gcc/mingw32)可以选择float的长度,是否与double一致。

12. 前缀L表示long(double)。

    虽然long double比double长4个字节,但是表示的数值范围却是一样的。

    long double类型的长度、精度及表示范围与所使用的编译器、操作系统等有关。 


====================================================================
(一)32位平台: 
分为有符号型与无符号型。 
有符号型: 
short 在内存中占两个字节,范围为-2^15~(2^15-1) 
int 在内存中占四个字节,范围为-2^31~(2^31-1) 
long在内存中占四个字节,范围为-2^31~2^31-1 
无符号型:最高位不表示符号位 
unsigned short 在内存中占两个字节,范围为0~2^16-1 
unsigned int 在内存中占四个字节,范围为0~2^32-1 
unsigned long在内存中占四个字节,范围为0~2^32-1 
实型变量: 
分单精度 float 和双精度 double 两种形式: 
float:占四个字节,提供7~8位有效数字。 
double: 占八个字节,提供15~16位有效数字。 

(二)16位平台: 
1)整型(基本型):类型说明符为int,在内存中占2个字节。 
2)短整型:类型说明符为short int或short。所占字节和取值范围均与整型(基本型)相同。 
3)长整型:类型说明符为long int或long,在内存中占4个字节。 
无符号型:类型说明符为unsigned。 
无符号型又可与上述三种类型匹配而构成: 
各种无符号类型量所占的内存空间字节数与相应的有符号类型量相同。但由于省去了符号位,故不能表示负数。 
实型变量: 
分为单精度(float型)、双精度(double型)和长双精度(long double型)三类。
单精度型占4个字节(32位)内存空间,其数值范围为3.4E-38~3.4E+38,只能提供七位有效数字。 
双精度型占8 个字节(64位)内存空间,其数值范围为1.7E-308~1.7E+308,可提供16位有效数字。 
长双精度型16 个字节(128位)内存空间,可提供18-19位有效数字。
============================================================================
C语言中5种基本数据类型的存储空间长度的排列顺序:
char = signed char = unsigned char < short int = unsigned short int <= int = unsigned int <= long int = unsigned long int  <= long long int = unsigned long long int
float <= double <= long double
用short修饰int时,short int表示短整型,占2字节的数据位.用long修饰int时,long int表示长整型,占4字节的数据位,在vc++6.0中int的数据类型也是占用了4字节的数据位,  那么应用int型与long型有什么区别呢? 下面就让我们来解答这个问题.我们知道现在的C++开发工具非常的多,int型在不同的系统中有可能占用的字节数会不一样, 而short与long修饰的int型的字节数是固定的,任何支持标准C++编译系统中都是如此.所以如果需要编写可移植性好的程序,应该将整型数据声明为short与long修饰的int型。





----------------------------------------------------------------------------------------
在C语言中,数据类型可分为:基本数据类型,构造数据类型,指针类型,空类型四大类。

1.中心数据列

  基本数据列最根本的特征是,其价值不可以再次解释为任何种类。也就是说,基本数据类是自说明的。

2.构造数据类型构造数据类型

  是根据已经定义之一个或多独数据类型用构造的办法来定义之。也就是说,一个构造类型的价值好说变成多少单“成员”或“元素”。每个“成员”都是一个为主数据类或者同时是一个构造类型。在C语言中,构造类型有以下几种:
·数组类型 ·结构类型 ·联合型

3.指针类型

 
 指针是一致种特殊的,同时以是富有至关重要作用的数据类型。其价值用来表示有个量在内存储器中之地址。虽然指针变量的取值类似于整型量,但这是少数只类别完全两样
的量,因此不克歪曲。4.空列在调用函数值时,通常应往调用者返回一个函数值。这个返回的函数值是有所一定之数据类型的,应以函数定义及函数说明中
给以说明,例如当例题中受起之max函数定义着,函数头为: int max(int a,int
b);其中“int
”类型说明符即表示该函数的返回值为整型量。又使以例题中,使用了库函数
sin,由于系统确定那函数返回值为双双精度浮点型,因此在赋值语句s=sin
(x);中,s
也得是夹精度浮点型,以便与sin函数的返回值一致。所以在征部分,把s说明呢对精度浮点型。但是,也闹同等接近函数,调用后并不需要向调用者返回函数
值,
这种函数可以定义也“空类型”。其色说明符为void。在第五段函数惨遭还要详细介绍。在本章中,我们先介绍中心数据列中之整型、浮点型和字符型。其余
类型在后各章中穿插介绍。

  对于基本数据类型量,按该取值是否只是改而分为常量和变量两种植。在程序执行过
程中,其价值不发生改变之量称为常量,取值可变的量称为变量。它们不过和数据类型结合起来分类。例如,可分为整型常量、整型变量、浮点常量、浮点变量、字符常
量、字符变量、枚举常量、枚举变量。在程序中,常量是足以不经说明要一直引用的,而变量则要优先证实后用。

整型量

整型量包括整型常量、整型变量。整型常量就是整常数。在C语言中,使用的整常数起八进制、十六进制和十进制三栽。

整型常量

1.八向前制整常反复八向前制整常反复要以0开头,即以0作为八前行制数的前缀。数码取值为0~7。八上前制数通常是无符号数。
以下各数是法定的八前进制数:
015(十进制为13) 0101(十进制为65) 0177777(十进制为65535)
以下诸数不是合法的八向前制数: 256(无前缀0)
03A2(包含了非八进制数码) -0127(出现了负号)

2.十六上前制整常反复
十六前进制整常数的前缀为0X或0x。其数量取值为0~9,A~F或a~f。
以下各数是合法的十六前行制整常数: 0X2A(十进制为42)  0XA0
(十进制为160)  0XFFFF (十进制为65535)
以下诸数不是官方的十六进制整常数: 5A (无前缀0X)  0X3H
(含有非十六进制数码)

3.十前行制整常反复 十上前制整常数没有前缀。其数量为0~9。
以下各数是官的十进制整常数: 237 -568 65535 1627
以下诸数不是合法的十进制整常数: 023 (不克发前方导0) 23D
(含有非十进制数码)

以次中凡因前缀来区别各种进制数的。因此当开时反复时不用管前缀弄错招结果未得法。

4.整型常数的后缀在16位字长的机器上,基本整型的长度为为
16各类,因此表示的频繁的界定吗是生限制的。十前进制无符号整常数之限制为0~65535,有记号数为-32768~+32767。八上制无符号数之表示范围
为0~0177777。十六进制无符号数的象征范围也0X0~0XFFFF或0x0~0xFFFF。如果采取的高频超过了上述范围,就不能不用长整型数来表
示。长整型数是故后缀“L”或“l”来表示的。例如: 十进制长整常数 158L
(十进制为158) 358000L (十进制为-358000) 八向前制长整常数 012L (十进制为10)
077L (十进制为63) 0200000L (十进制为65536) 十六进制长整常数 0X15L
(十进制为21) 0XA5L (十进制为165) 0X10000L (十进制为65536)
长整数158L以及着力整常数158
在数值达到连随便分。但针对158L,因为是增长整型量,C编译系统将为其分配4独字节存储空间。而针对158,因为是主导整型,只分红2
单字节的储存空间。因此当运算和出口格式上要赋予注意,避免失误。无符号数为可用后缀表示,整型常数的无符号数的后缀为“U”或“u”。例如:
358u,0x38Au,235Lu
均为无符号数。前缀,后缀可同时用以代表各种类型的屡屡。如0XA5Lu表示十六进制无符号长整数A5,其十进制为165。

整型变量

整型变量可分为以下几近似: 1.基本型
类型说明符为int,在内存中占据2独字节,其取值为主导整常数。 2.短整量
类型说明符为short int或short’C110F1。所占用字节和取值范围全和基本型相同。
3.长整型 类型说明符为long int或long
,在内存中占4独字节,其取值为长整常数。 4.无符号型
类型说明符为unsigned。 无符号型又可与上述三栽类型匹配而做:
(1)无符号基本型 类型说明符为unsigned int或unsigned。 (2)无符号短整型
类型说明符为unsigned short (3)无符号长整型 类型说明符为unsigned long
各种无符号类型量所占用的内存空间字节数与相应的生记号类型量相同。但鉴于省去了标记位,故不可知表示负数。
下表列出了Turbo C中各队整型量所分配的外存字节数及数的意味范围。
类型说明符    数的限定     分配字节数 int
      -32768~32767     ■■ short int    -32768~32767
    ■■ signed int    -32768~32767     ■■ unsigned int  
0~65535        ■■ long int  -2147483648~2147483647  ■■■■
unsigned long  0~4294967295     ■■■■ 整型变量的印证
变量说明的貌似式为: 类型说明符 变量名叫标识符,变量名叫标识符,…;
例如: int a,b,c; (a,b,c为整型变量) long x,y; (x,y为长整型变量) unsigned
p,q; (p,q为无符号整型变量)

当书变量说明时,应小心以下几点:
1.兴在一个档次说明符后,说明多个一律类别的变量。各变量名中用逗号间隔。类型说明称与变量叫做以内起码用一个空格间隔。
2.尾声一个变量叫作自此必须为“;”号最后。
3.变量说明要放在变量使用前。一般放在函数体的始部分。     x,
y是丰富整型变量,a,
b是主导整型变量。它们之间允许进行演算,运算结果吧长整型。但c,d被定义为核心整型,因此最终结果为骨干整型。本例说明,不同门类的量足以参与运算并
相互赋值。其中的类型转换是由编译系统自动就的。有关类型转换的条条框框以当此后介绍。

实型量

实型常量

实型也称之为浮点型。实型常量也叫做实数或者浮点数。在C语言中,实数只利用十进制。它来二种形式:
十进制数形式指数形式 1.十前进制数形式 由数码0~
9和小数点组成。例如:0.0,.25,5.789,0.13,5.0,300.,-267.8230相当于统统为官的实数。
2.指数形式
由十上前制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以带符号)组成。其相似式为a
E n (a为什向前制数,n为十进制整数)其值为 a*10,n 如: 2.1E5
(等于2.1*10,5), 3.7E-2 (等于3.7*10,)-2*) 0.5E7 (等于0.5*10,7),
-2.8E-2 (等于-2.8*10,)-2*)以下无是合法的实数 345 (无多少数点) E7
(阶码标志E之前不管数字)  -5 (无阶码标志) 53.-E3 (负号位置不对) 2.7E
(无阶码)
标准C允许浮点数使用后缀。后缀为“f”或“F”即表示该数为浮点数。如356f以及356.是相当价格的。例2.2证明了这种气象:
void main() { printf(“%f\n%f\n”,356.,356f); } void
指明main不回来外值 利用printf显示结果 结束

实型变量

实型变量分为两近乎:单精度型和双精度型, 其种类说明符为float
单精度说明符,double 双精度说明符。在Turbo
C中只是精度型占4单字节(32各)内存空间,其数值范围吗3.4E-38~3.4E+38,只能提供七个中数字。双精度型占8
独字节(64位)内存空间,其数值范围也1.7E-308~1.7E+308,可提供16号中数字。
实型变量说明的格式和开规则及整型相同。 例如: float x,y;
(x,y为特精度实型量) double a,b,c; (a,b,c为对精度实型量)
实型常数不分单、双精度,都按双精度double型处理。 void main(){ float a;
double b; a=33333.33333; b=33333.33333333333333;
printf(“%f\n%f\n”,a,b); } 此程序说明float、double的不等 a ■■■■ b
■■■■■■■■ a<—33333.33333 b<—33333.33333333333;; 显示程序结果
此程序说明float、double的差 float a; double b; a=33333.33333;
b=33333.33333333333333; 从本例可以看到,由于a
是仅仅精度浮点型,有效位数只出七个。而整数已占五员,故小数二员后后都为无用数字。b
是对精度型,有效位呢十六号。但Turbo C
规定小数后最好多保留六各项,其余部分四放弃五相符。

字符型量

字符型量包括字符常量和字符变量。

字符常量
字符常量是用单引号括起来的一个字符。例如’a’,’b’,’=’,’+’,’?’都是合法字符常量。在C语言中,字符常量有以下特点:
1.字符常量只能用单引号括起来,不克为此双引号或其他括号。
2.字符常量只能是单科字符,不能够是字符串。
3.字符可以是字符集中任意字符。但数字为定义为字符型之后虽
不能够参与数值运算。如’5’和5 是差的。’5’是字符常量,不克与运算。

转义字符
转义字符是平等种新鲜之字符常量。转义字符以相反斜?quot;\”开头,后及一个要么几独字符。转义字符具有一定的含义,不同于字符原有的义,故称“转义”
字符。例如,在前头各例题printf函数的格式串中之所以到之“\n”就是一个转义字符,其意思是“回车换行”。转义字符主要为此来表示那些用一般字符不便于
表示的控制代码。 常用之转义字符及其含义 转义字符  转义字符的含义 \n
     回车换行 \t      横向跳到下一制表位置 \v
     竖向跳格 \b      退格 \r      回车 \f    
 走纸换页 \\      反斜线符”\” \’      单引号符 \a
     鸣铃 \ddd     1~3个八进制数所表示的字符 \xhh
    1~2位十六上前制数所代表的字符
广义地言语,C语言字符集中之任何一个字符均可用转义字符来表示。表2.2着之\ddd和\xhh正是为者要提出的。ddd和hh分别吗八进制和十六进制的
ASCII代码。如\101表示字?quot;A”
,\102代表字母”B”,\134意味着反斜线,\XOA代表换行等。转义字符的使
void main() { int a,b,c; a=5; b=6; c=7; printf(“%d\n\t%d %d\n %d
%d\t\b%d\n”,a,b,c,a,b,c); } 此程序练习转义字符的运用
a、b、c为整数 5->a,6->b,7->c 调用printf显示程序运行结果
printf(“%d\n\t%d %d\n %d %d\t\b%d\n”,a,b,c,a,b,c);
程序在第一列输出a值5随后虽是“\n”,故回车换行;接着又是“\t”,于是跳到下一致制表位置(设制表位置距离为8),再出口b值6;空二格再出口c
值7继同时是”\n”,因此又回车换行;再空二格之后还要输出a值5;再空三格又输出b的值6;再次后”\t”跳到下一样制表位置(与齐一行的6
对合),但下同样转义字符“\b”又如果退回一格,故紧挨在6更出口c值7。

字符变量
字符变量的取值是字符常量,即单个字符。字符变量的花色说明称是char。字符变量类型说明的格式和书写规则都跟整型变量相同。
例如: char a,b;
每个字符变量被分配一个字节的内存空间,因此不得不存放一个字符。字符值是以ASCII码的花样存放于变量的内存单元中的。如x的
十进制ASCII码是120,y的十进制ASCII码是121。对字符变量a,b赋予’x’和’y’值:
a=’x’;b=’y’;实际上是以a,b两个单元内存放120暨121的第二迈入制代码: a 0 1 1 1
1 0 0 0 b 0 1 1 1 1 0 0 1 用也足以管它们当做是整型量。
C语言允许对整型变量赋以字符值,也允许对字符变量赋以整型值。在出口时,
允许把字符变量按整型量输出,也同意将整型量按字符量输出。
整型量为第二字节量,字符量为才字节量,当整型量按字符型量处理常,
只出低八位字节参与拍卖。 main(){ char a,b; a=120; b=121;
printf(“%c,%c\n%d,%d\n”,a,b,a,b); } a ■ b ■ a <– 120 b <— 121
显示程序结果 char a,b; a=120; b=121;
本程序中说明a,b为字符型,但以赋值语句中赋以整型值。从结果看,a,b值的输出形式在printf函数格式串中之格式符,当格式符为”c”时,对许输出的变量值为字符,当格式符为”d”时,对诺输出的变量值为整数。
void main(){ char a,b; a=’x’; b=’y’; a=a-32; b=b-32;
printf(“%c,%c\n%d,%d\n”,a,b,a,b); } a,b被证明也字符变量并给予字符值
把小写字母换成大写字母 以整型和字符型输出
本例中,a,b被认证也字符变量并予以字符值,C语言允许字符变量参与数值运算,即用字符的ASCII
码参与运算。由于那个小写字母的ASCII
码相差32,因此运算后把小写字母换成大写字母。然后分别以整型和字符型输出。

字符串常量 字符串常量是由于同针对双引号括起底字符序列。例如: “CHINA” ,”C
program: , “$12.5”
等还是官方的字符串常量。字符串常量和字符常量是不同的量。它们之间要出以下分别:
1.字符常量由单引号括起来,字符串常量由双引号括起来。
2.字符常量只能是单个字符,字符串常量则可以涵盖一个要多只字符。
3.可以将一个字符常量赋予一个字符变量,但非克管一个字符串常量赋予一个字符变量。在C语言中从来不相应的字符串变量。
这是暨BASIC
语言不同之。但是可以为此一个字符数组来存放一个字符串常量。在三番五次组同样节内给予介绍。
4.字符常量占一个字节的内存空间。字符串常量占的外存字节数等于字符串中配节数加1。增加的一个字节中存放字符”\0″(ASCII码为0)。这是字符
串了的标志。例如,字符串 “C program”在内存中所占用的字节为:C
program\0。字符常量’a’和字符串常量”a”虽然都止发一个字符,但每当内存中之图景是不同之。
‘a’在内存中占一个字节,可代表也:a
“a”在内存中据为己有二单字节,可代表为:a\0符号常量

标记常量
在C语言中,可以就此一个标识符来代表一个常量,称之为符号常量。符号常量在采取前务必先行定义,其相似式为:
#define 标识符 常量
其中#define也是同等长预处理命令(预处理命令还?quot;#”开头),称为宏定义命令(在第九回预处理程序中将更介绍),其作用是管欠标识符
定义为后底常量值。一经定义,以后当先后中有所出现该标识符的地方全代表之为该常量值。习惯及记常量的标识符用大写字母,变量标识符用小写字母,以示区
别。 #define PI 3.14159 void main(){ float s,r; r=5; s=PI*r*r;
printf(“s=%f\n”,s); } 由宏定义命令定义PI 为3.14159
s,r定义为实数 5->r PI*r*r->s 显示程序结果 float
s,r; r=5; s=PI*r*r; 本程序于主函数前由于宏定义命令定义PI
为3.14159,在次中不怕坐该值代替PI
。s=PI*r*r等效于s=3.14159*r*r。应该小心的凡,符号常量不是变量,它所代表的价值当合作用域内无克再次变更。也就是说,在先后中,不
能再就此赋值语句针对其再也赋值。

变量的初值和类型转换

变量赋初值
在次中常要对变量赋初值,以便利用变量。语言程序中只是发生多法,在概念时赋以初值的方,这种艺术称为初始化。在变量说明中赋初值的貌似式为:
类型说明符 变量1= 值1,变量2= 值2,……; 例如: int a=b=c=5; float
x=3.2,y=3f,z=0.75; char ch1=’K’,ch2=’P’;
应注意,在证明遭到未同意连续赋值,如a=b=c=5是无合法的。 void main(){ int
a=3,b,c=5; b=a+c; printf(“a=%d,b=%d,c=%d\n”,a,b,c); }
a<—3,b<–0,c<—5 b<–a+c 显示程序运行结果

变量类型的转换 变量的数据类型是足以换的。转换的方有少栽,
一栽是半自动转换,一种植是强制转换。

自动转换
自动转换发生在不同数据类型的计量混合运算时,由编译系统自动完成。自动转换遵循以下规则:
1.若参与运算量的门类不同,则先行易成为同一档次,然后开展演算。
2.换按数量长度增加的大方向拓展,以管教精度不下降。如int型和long型运算时,先管int量转成long型后再拓展演算。
3.所有的浮点运算都是坐双精度进行的,即使单纯含float单精度量运算的表达式,也要是先换成为double型,再作运算。
4.char型和short型参与运算时,必须先转移成为int型。
5.在赋值运算被,赋值号两止量的数据类型不同时,
赋值号右侧边量的类型将更换为左边量的门类。
如果右边量的数据类型长度左边长时,将少一部分数据,这样见面下滑精度,
丢失的一些按四放弃五切进舍入。图2 1意味了种类自动转换的条条框框。 void
main(){ float PI=3.14159; int s,r=5; s=r*r*PI; printf(“s=%d\n”,s); }
PI<–3.14159 s<–0,r<–5 s<–r*r*PI 显示程序运行结果 float
PI=3.14159; int s,r=5; s=r*r*PI;
本例程序中,PI为实型;s,r为整型。在履行s=r*r*PI语句时,r和PI都变成为double型计算,结果吧也double型。但鉴于s为整型,故赋值结果按为整型,舍去矣小数部分。

强制类型转换 强制类型转换是由此类型转换运算来促成之。其相似式吗:
(类型说明符) (表达式)
其作用是将表达式的运算结果强制转换成为类型说明符所表示的类型。例如:
(float) a 把a转换为实型(int)(x+y)
把x+y的结果转换为整型在用强制转换时应小心以下问题:
1.类型说明符和表达式都要加括号(单个变量可以免加括号),如将(int)(x+y)写成(int)x+y则成为了将x转换成int型之后再也跟y相加了。
2.无论是强制转换或是自动转换,都只是是为着本次运算的要而针对性变量的多寡长度进行的临时转换,而不转移多少证明时对该变量定义之类型。
main(){ float f=5.75; printf(“(int)f=%d,f=%f\n”,(int)f,f); }
f<–5.75 将float f强制转换成int f float
f=5.75;printf(“(int)f=%d,f=%f\n”,(int)f,f);
本例表明,f虽强制转为int型,但只当运算被打作用,
是现的,而f本身的种类并无改动。因此,(int)f的值也
5(删去了小数)而f的价仍为5.75

  程序中使用的各种变量都应预先加以定义,即先定义,后使用。对变量的定义可以包括三个方面:数据类型、存储类型、作用域。

用户存储空间可以分成三单有:

  1. 程序区;
  2. 静态存储区;
  3. 动态存储区;

于变量的作用域(即于半空)角度来划分,可以分成全局变量和片变量。

从今变量值存在的发时间(即生存期)角度来分,可以分成静态存储方及动态储存方。

    静态存储方:是依靠当程序运行期间分配一定的囤空间的方式。

   
动态储存方:是当程序运行期间因需要开展动态的分配存储空间的办法。

 
全局变量全部存于静态存储区,在先后开始推行时为全局变量分配存储区,程序实施了便自由。在程序执行过程中她占有一定的存储单元,而未动态地展开分红和释放;

  动态存储区存放以下数据:

  1. 函数形式参数;
  2. 机关变量(未加static声明的部分变量);
  3. 函数调用实底实地维护以及归地址;

对上述这些数据,在函数开始调用时分配动态储存空间,函数结束时释放这些空中。在c语言中,每个变量和函数有三三两两只特性:数据类型和数目的积存类别。

为提高效率,C语言允许将有变量得值在CPU中之寄存器中,这种变量叫“寄存器变量”,用要字register作声明。

PS:

  1. 只来部分自动变量和式参数可以用作寄存器变量;
  2. 一个处理器体系中之寄存器数目少,不能够定义任意多单寄存器变量;
  3. 有的静态变量不可知定义为寄存器变量。

 
外部变量(即全局变量)是以函数的标定义的,它的作用域为自变量定义处开始,到以程序文件的终极。如果外部变量不以文书之开头定义,其行的意向范围只限于定义处及文件到底了。如果在定义点之前的函数想引用该表变量,则应当在援之前用要字extern对拖欠变量作“外部变量声明”。表示该变量是一个早已定义之表面变量。有矣这个声明,就足以从“声明”处从,合法地用该表变量。

  数据类型

论被定义变量的性能,表示形式,占据存储空间的略微,构造特点来划分的。在C语言中,数据类型可分为:基本数据类,构造数据类型,指针类型,空类型四百般类。

C语言 1

 
对于基本数据类型量,按该取值是否只是改而分为常量和变量两种植。在程序执行过程中,其价值不发出变动之量称为常量,其值可变的量称为变量。它们而和数据类型结合起来分类。例如,可分为整型常量、整型变量、浮点常量、浮点变量、字符常量、字符变量、枚举常量、枚举变量。在程序中,常量是好不经说明要一直引用的,而变量则要优先定义后用。整型量包括整型常量、整型变量。

常量

于程序执行过程遭到,其价值不发出变动之量称为常量。

直白常量(字面常量):

整型常量:12、0、-3;

实型常量:4.6、-1.23;

字符常量:‘a’、‘b’。

标识符:用来标识变量名、符号常量名、函数叫、数组名、类型名、文件称之实惠字符序列。

符常量:用标示符代表一个常量。在C语言中,可以为此一个标识符来表示一个常量,称之为符号常量。

标志常量在用前务必先行定义,其貌似式为:#define 标识符 常量

 

其中#define也是均等漫长预处理命令(预处理命令还因为”#”开头),称为宏定义命令(在末端预处理程序中将进一步介绍),其效是将该标识符定义为随后之常量值。一经定义,以后在先后中装有出现该标识符的地方都代表的因该常量值。

习惯及记常量的标识符用大写字母,变量标识符用小写字母,以展示区别。使用标志常量的便宜是:含义清楚;能做到“一改都改成”。

变量

一个变量应该生出一个名字,在内存中占据得之存储单元。变量定义必须在变量使用之前。一般放在函数体的起部分。要有别于变量名和变量值是少单不等的概念。

     

C语言 2

 

整型数据

整型常量

纵然整常数。在C语言中,使用的整常数起八进制、十六进制和十进制三栽。

十迈入制整常数:十前行制整常数没有前缀。其数据为0~9。

八进制整常数:八进制整常反复要以0开头,即以0作为八上制数的前缀。数码取值为0~7。八向前制数通常是无符号数。

十六前行制整常数:十六上前制整常数的前缀为0X或0x。其数额取值为0~9,A~F或a~f。

整型常数的后缀:在16各类字长的机器上,基本整型的长也也16各项,因此表示的多次的限制吗是发生限制的。十进制无符号整常数的限定为0~65535,有号子数也-32768~+32767。八向前制无符号数的象征范围吗0~0177777。十六进制无符号数之代表范围为0X0~0XFFFF或0x0~0xFFFF。如果用的数过了上述限,就必须用丰富整型数来表示。长整型数是用后缀“L”或“l”来代表的。

 

整型变量

整型数据在内存中的存放形式

若定义了一个整型变量i:

int i;

i=10;

i  10

C语言 3

数值是因补码表示的:

赶巧数的补码和原码相同;

负数的补码:将该数的绝对值的二进制形式按位取反再加1。

左的第一号是意味符号的。

整型变量的分类

基本型:类型说明符为int,在内存中据为己有2单字节。

短整量:类型说明符为short int或short。所占字节和取值范围均和基本型相同。

加上整型:类型说明符为long int或long,在内存中占据4只字节。

无符号型:类型说明符为unsigned。

无符号型又可与上述三种档次匹配而做:

无符号基本型:类型说明符为unsigned int或unsigned。

无符号短整型:类型说明符为unsigned short。

无符号长整型:类型说明符为unsigned long。

各种无符号类型量所占据的内存空间字节数与相应的发标志类型量相同。但由节省了号位,故未能够代表负数。

 

 

花色说明                    符数的克                            字节数

int-32768~32767                         
即-215~(215-1) 2

unsigned int0~65535                    即0~(216-1)     2

short int-32768~32767                 
即-215~(215-1) 2

unsigned short int0~65535            即0~(216-1)     2

long int-2147483648~2147483647 即-231~(231-1) 4

unsigned long0~4294967295          即0~(232-1)     4

 

 

实型常量

也称为浮点型。实型常量也称为实数或者浮点数。在C语言中,实数只下十进制。它起二种形式:十进制小数形式,指数形式。

十前行制数形式:由数码0~ 9和小数点组成。注意,必须有小数点。

指数形式:由十向前制数,加阶码标志“e”或“E”以及阶码(只能为整数,可以拉动符号)组成。其相似式吗:a
E n(a为什上前制数,n为十进制整数)其值为 a*10n

标准C允许浮点数使用后缀。后缀为“f”或“F”即意味着该数为浮点数。如356f跟356.凡当价格的

实型数据在内存中的寄放形式

实型数据一般占4只字节(32各)内存空间。按指数形式储存。实数3.14159于内存中之存放形式如下:

+ .314159 1

        数符          小数部分                  指数

小数部分占用的位(bit)数更是多,数的有用数字越多,精度越来越高。

指数部分占用的各项数更是多,则能够代表的数值范围进一步深。

 

实型变量的归类

实型变量分为:单精度(float型)、双精度(double型)和添加对精度(long
double型)三类。

 

当Turbo
C中唯有精度型占4个字节(32号)内存空间,其数值范围吗3.4E-38~3.4E+38,只能提供七各项中数字。双精度型占8
独字节(64各)内存空间,其数值范围吗1.7E-308~1.7E+308,可提供16员中数字。

类型说明符 比特数(字节数) 有效数字 数的范围
float 32(4) 6~7 10-37~1038
double 64(8) 15~16 10-307~10308
long double 128(16) 18~19 10-4931~104932

实型数据的舍入误差

由于实型变量是由少数的存储单元组成的,因此会提供的有效数字连续有限的。

a
是单纯精度浮点型,有效位数只发生七员。而整数已占有五位,故小数二号后下都为无用数字。

b 是双精度型,有效位吗十六各。但Turbo C
规定小数后极多保留六员,其余部分四放弃五称。

PS:实型常数不分单、双精度,都以双精度double型处理。

 

字符型数据

包括字符常量和字符变量。

字符常量是因此单引号括起来的一个字符。例如:’a’、’b’、’=’、’+’、’?’都是官字符常量。

字符常量只能用单引号括起来,不克因此双引号或另括号。

字符常量只能是单科字符,不能够是字符串。

字符可以是字符集中任意字符。但数字让定义为字符型之后便无克与数值运算。如’5’和5
凡是不同的。’5’是字符常量,不克与运算。

 

转义字符是平等栽新鲜的字符常量。转义字符以反斜线”\”开头,后同一个或几乎独字符。转义字符具有一定的含义,不同为字符原有的意义,故称“转义”字符。例如,在头里各例题printf函数的格式串中之所以到的“\n”就是一个转义字符,其义是“回车换行”。转义字符主要为此来表示那些用一般字符不便于代表的控制代码。

 

转义字符 转义字符的意义 ASCII代码
\n 回车换行 10
\t 横向跳到下一制表位置 9
\b 退格 8
\r 回车 13
\f 走纸换页 12
\\ 反斜线符"\" 92
\’ 单引号符 39
    \” 双引号符 34
\a 鸣铃 7
\ddd 1~3位八进制数所代表的字符  
\xhh 1~2位十六进制数所代表的字符  

广义地言语,C语言字符集中的另一个字符均可用转义字符来代表。表中的\ddd和\xhh正是为这而提出的。ddd和hh分别吗八进制和十六进制的ASCII代码。如\101表示字母”A”
,\102象征字母”B”,\134代表反斜线,\XOA表示换行等。

字符变量用来囤积字符常量,即单个字符。字符变量的品种说明称是char。字符变量类型定义的格式和开规则都同整型变量相同。例如:char
a,b;

每个字符变量被分配一个字节的内存空间,因此只好存放一个字符。字符值是盖ASCII码的款型存放于变量的内存单元中的。

例如:

a=’x’;

b=’y’;

其实是在a,b两只单元内存放120与121底亚上制代码:

a:

0 1 1 1 1 0 0 0

 

b:

0 1 1 1 1 0 0 1

 

故而啊堪将她当是整型量。C语言允许对整型变量赋以字符值,也允许对字符变量赋以整型值。在出口时,允许把字符变量按整型量输出,也同意将整型量按字符量输出。

整型量为次字节量,字符量为单纯字节量,当整型量按字符型量处理时,只出逊色八位字节参与处理。

 

字符串常量

字符串常量是出于同样针对性双引号括起底字符序列。

字符串常量和字符常量是见仁见智之计量。它们中要发生以下分别:

字符常量由单引号括起来,字符串常量由双引号括起来。

字符常量只能是单科字符,字符串常量则可涵盖一个要多个字符。

好管一个字符常量赋予一个字符变量,但未能够拿一个字符串常量赋予一个字符变量。在C语言中从未对号入座的字符串变量。这是同BASIC
语言不同的。但是得就此一个字符数组来存放在一个字符串常量。在多次组一致段内予以介绍。

字符常量占一个字节的内存空间。字符串常量占的内存字节数等于字符串中配节数加1。增加的一个字节中存放字符”\0″
(ASCII码为0)。这是字符串结束之表明。

字符串 “C program” 在内存中所占据的字节为:

C   p r o g r a m \0
----------------------------------------------------------------------------------------

 

 

c语言基本数据类short、int、long、char、float、double

  C 语言包含的数据类型如下图所示:

一致、数据类型与“模子”  short、int、long、char、float、double
这六单关键字表示C 语言里之六种为主数据类。   怎么去领悟它们也?
举个例:见了藕煤球的百般东西吧?(没见了?煤球总见过吧)。那个东西叫藕煤器,拿在其当与好之煤堆里这么一咔,一个煤球出来了。半径12cm,12
个洞。不同型号的莲藕煤器咔出来的煤球大小不一样,孔数为无平等。这个藕煤器其实就是个模型。
  现在我们联想一下,short、int、long、char、float、double
这六只东东是勿是蛮像不同门类的莲藕煤器啊?拿在它们以内存达到咔咔咔,不同尺寸的内存就分配好了,当然别忘了受其取个好听的名字。
  在32 位的网上short 咔出来的内存大小是2 单byte;  int
咔出来的内存大小是4 个byte;  long 咔出来的内存大小是4 个byte;  float
咔出来的内存大小是4 个byte;  double 咔出来的内存大小是8 个byte;  char
咔出来的内存大小是1 单byte。
 (注意这里因一般情形,可能两样的阳台还会迥然不同,具体平台好就此sizeof
关键字测试一下)  
很简短吧?咔咔咔很爽吧?是甚粗略,也确确实实很凉爽,但问题虽是若咔出来这么多外存块,你到底不可知叫他获名字叫做x1,x2,x3,x4,x5…要长江1
号,长江2
号…吧。它们增长得如此像(不是你家的百般,老二,老三…),过一会儿你便见面遗忘了究竟孰名字与哪个内存块匹配了(到底哪个嫁为哪个了呀?^_^)。所以呢,给他们获得一个好之名绝对要。下面我们不怕来研讨研究获得哪的名字吓。
  二、变量的命名规则
 1、命名该直观且可拼读,可望文知意,便于记忆和阅读。
 标识符最好使用英文单词或该做,不容许行使拼音。程序中的英文单词一般不要太复杂,用词应规范。
  2、命名的长度应当符合“min-length && max-information”原则。  C
是均等栽精简的语言, 命名也相应是精简之。例如变量名MaxVal
就于MaxValueUntilOverflow
好用。标识符的长度一般不要了长,较丰富之光词可经过去丢“元音”形成缩写。  
另外,英文词尽量不缩写,特别是特别用专业名词,如果来缩写,在平等系统受对相同单词要使用同一之代表拟,并且注明其意思。
 
3、当标识符由多单词做时,每个词之第一独字母大写,其余全部大写。比如:
    int CurrentVal;  这样的讳看起较清楚,远较同一加上串字符好得多。  
4、尽量避免名字被冒出数字编号,如Value1,Value2
等,除非逻辑上的确需要编号。比如使开发时也无脚命名,非编号名字反而不好。
 初家总是喜欢用带编号的变量名或函数曰,这样子看上去很简短方便,但实质上是一颗颗定时炸弹。这个习惯初家一定要是改变过来。
 
5、对以差不多个文本里联合使用的全局变量或函数要加范围限定符(建议采取模块名(缩写)作为限制限定符)。
 (GUI_ ,etc)标识符的命名规则:  
6、标识符名分为两片:规范标识符前缀(后缀) +
含义标识。非全局变量可以不用动范围限制符前缝。

7、作用域前缀命名规则。

8、数据类型前缀命名规则。

 

 

9、含义标识命名规则,变量命名使用名词性词组,函数命名使用动词性词组。例如:

变量含义标识符构成:目标词+ 动词(的过去分词)+ [状语] + [目的地];

函数含义标识符构成:动词(一般现时)+目标词+[状语]+[目的地];  
10、程序中不得起不过凭借大小写区分的貌似的标识符。例如:     int x, X;
变量x 与X 容易混淆     void foo(int x); 函数foo 与FOO 容易混淆     void
FOO(float x);
 这里还有一个设特别注意的尽管是1(数字1)和l(小写字母l)之间,0(数字0)和o(小写字母o)之间的界别。这片针对真是非常不便分的,我既的一个同事就让此问题折腾了同一次于。
  11、一个函数叫作禁止让用于其他的处在。例如:  #include “c_standards.h”
 void foo(int p_1)  {     int x = p_1;  }  void static_p(void)  {    
int foo = 1u;  }  
12、所有宏定义、枚举常数、只读变量全用非常写字母命名,用生划线分割单词。例如:
 const int MAX_LENGTH = 100;
//这不是常量,而是一个才读变量,具体要往后关禁闭     #define FILE_PATH
“/usr/tmp”  
13、考虑到习惯性问题,局部变量中只是使通用的命名方式,仅限于n、i、j
等当循环变量使用。  一定不要写来如下这样的代码:     int p;     char
i;     int c;     char * a;  一般的话习惯及用n,m,i,j,k 等代表int
类型的变量;c,ch 等表示字符类型变量;a 等表示数组;p
等象征指针。当然这只有是一般习惯,除了i,j,k
等得据此来代表循环变量外,别的字符变量名尽量不要使。  
14、定义变量的而千万千万别忘了初始化。定义变量时编译器并不一定清空了这块内存,它的价可能是废的数目。这个问题在内存管理那节来格外详细的讨论,请参见。
 
15、不同门类数据里面的演算而注意精度扩展问题,一般没有精度数据将朝高精度数据扩展
<br />本文来源【C语言中文网】:<a
href=”http://see.xidian.edu.cn/cpp/html/437.html”
target=”_blank”>http://see.xidian.edu.cn/cpp/html/437.html&lt;/a&gt;