变量与常量


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

数据:数据类型关键字


最初K&R标准C90标准C99标准
intsigned_Bool
longvoid_Complex
short _Imaginary
unsigned
char
float
double
  • 按计算机的存储方式,可分为两大基本类型:整数类型浮点数类型
  • 整数和浮点数:计算机以二进制数字存储整数;而把浮点数分成小数部分和指数部分来表示,并分开存储这两部分。
  • 位、字节和字:位是计算机的最小存储单位,可以存储0或1,即二进制数字,或者说位用于设置“开”或“关”;字节是是能表示一个完整数据的基本单位,1字节均为8位;字是设计计算机时给定的自然存储单位,即常说的字长,比如目前的64位字长计算机,计算机的字长越大,其数据转移越快,允许的内存访问页更多。

基本数据类型


int类型

  1. 声明
    int erns;

int hogs,cows;

  1. 初始化
    erns = 21;

int ogs = 22,cows=23;

  1. int类型常量
    上面出现的整数(21,22,23)都是整型常量和整型字面量。
  2. 打印
    可以使用printf()函数打印int类型的值,使用【%d】(十进制整数)转换说明。
  3. 八进制十六进制
    使用:在C语言中用特定的前缀表示使用哪种进制。0x或0X前缀表示十六进制,0前缀表示八进制。
  4. 显示八进制十六进制:使用printf()函数,以8进制显示使用【%0】转换说明,以十六进制使用【%x】转换说明。另外要显示各进制数的前缀0、0x和0X,必须分别使用【%#0】、【%#x】、【%#X】。

其他整型常量

C语言提供3个附属关键字修饰基本整数类型:shortlongunsigned,注意以下几点:

  1. short int类型(或者简写为short)占用的存储空间【可能】比int类型少
  2. long int或long占用的存储空间【可能】比int多
  3. long long int或long long占用的存储空间【可能】比long多
  4. unsigned int或unsigned只用于非负值场合。
  5. 在任何有符号类型前面添加关键字signed,可强调使用有符号类型的意图。
  6. 声明
long int estime;
long johns;
short int erns;
short ribs;
unsigned int s_count;
unsigned players;
unsigned long headcount;
unsigned short yesvotes;
long long ago;
  1. 使用多种数据类型的原因

    1. C语言只规定了short占用的存储空间不能多于int,long占用的存储空间不能少于int,这样规定是为了适应不同机器。
    2. C标准对基本数据类型只规定了允许的最小大小。
    3. int类型的选择:首先,考虑unsigned类型。这种类型常用于计数,因为计数不用负数,而且unsigned可以表示更大的正数。
      当一个数超出了int类型的取值范围且在long类型取值范围内时,就使用long类型。对于那些long占用空间比int大的系统,使用long会减慢运算速度。因此,如非必要不要使用long类型。

    如果在long和int占用存储空间相同的机器上编写代码,当确实需要32位整数时,应使用long而不是int,以便程序移植到16位机后任然可以正常工作。

  2. long常量和long long常量
    通常程序中使用的数组都被存储为int,当数字超出了int类型能表示的范围,编译器就会将其视为更大一种的类型,直到能够表示该数字。

常量显示指导数据类型,可以在值的末尾加上l或L(long)后缀、ll或LL后缀(long long)、u或U(unsigned)。
整数溢出:当超过最大值,重新回到最小值开始计数。

  1. 打印short、long、long long和unsigned类型
类型转换说明
unsigned int%u
long%ld:十进制、%lx:十六进制、%lo:八进制
short%hd:十进制、%hx:十六进制、%ho:八进制
unsigned long%lu
unsigned short%hu

额外说明:

1. C标准只规定了允许的最小大小,因此某些数据类型的占用存储大小依计算机系统而异,占用存储越大所能表示的值范围也越大。
2. 一般而言,一个int占用一个机器字长。
3. 一般而言,系统用一个特殊位的值表示有符号数的正负号。
4. 如上,因为符号位会占用掉一位,所以无符号比有符号能表示更大的数。

char类型

char类型用于存储字符,但从技术层面看,char是整数类型。计算机使用数字编码来处理字符,即用特定的整数表示特定的字符。如美国最常用的ASCII编码,标准ASCII码的范围是0~127,只需七位二进制数即可表示。

  1. 声明
    char response;

char itable,latan;

  1. 字符常量和初始化
    char grade = 'A';
  2. 非打印字符
    浏览ASCII表会发现,有些ASCII字符打印不出来。C语言提供了3种方法表示这些字符

    1. 使用ASCII码
      char beep = 7;
    2. 使用特殊符号序列表示一个特殊字符。这些符号叫转义序列。
      char nerf = '\n';
    3. 使用十六进制形式表示字符常量。
      转义序列如下表:
转义序列含义
\a警报
\b退格
\f换页
\n换行
\r回车
\t水平制表符
\v垂直制表符
\\反斜线(\)
\'单引号
\"双引号
\?问号
\0oo八进制值(oo必须是有效的八进制数,即每个o可表示0~7中的一个数)
\xhh十六进制值(hh必须是有效的十六进制数,即每个h可表示0~f中的一个数)
  1. 打印字符
    printf()函数用【%c】指明待打印的字符。如果用%d打印的是一个整数。
  2. 有符号还是无符号
    不同的编译器把char实现为有符号和无符号,C语言允许在关键字char前使用signed或unsigned,这在用char处理小整数时很有用。

_Bool类型

_Bool类型用于表示布尔值,即逻辑值true和false。它仅占用1位存储空间,因为它只有两个值。

可移植类型

在stdint.h和inttypes.h头文件提供了可移植类型,如int32_t,表示32位的有符号整数类型,根据不同系统,编译器会找出同是32位的整数类型(如 int或long),并把int32_t作为其别名,这样就保证了在不同系统中使用相同类型的整数。

float、double和long double

浮点数的表示类似于科学计数法(即用小数乘以10的幂来表示数字)。该计数系统常用于表示非常大或非常小的数。科学计数法在计算机中的写法为指数计数法(或称为e计数法),e后面的数字代表10的指数。

  1. 声明
float noah, jonah;
double trouble;
float planck = 6.63e-34;
long double gnp;
  1. 浮点型常量
    -1.56E+12

2.87e-3

  1. 打印
    printf()函数使用【%f】转换说明打印十进制计数法的float和double类型浮点数,用【%e】打印指数计数法的浮点数;a和A表示十六进制格式的浮点数;打印long double类型要使用【%Lf】、【%Le】或【%La】转换说明。
  2. 浮点值的上溢和下溢

    • 上溢为当计算导致数字过大,超过当前类型能表达的范围时,C就会为此结果赋一个表示无穷大的特定值,而printf()显示该值为inf或infinity。
    • 下溢表示当某个数指数部分已经是最小值,而一个操作会减小其指数部分(比如除以2),所以计算机只好把尾数部分向右移,空出一个二进制位并丢弃最后一个二进制数,虽然得到了结果但计算过程中损失了原末尾有效位上的数字。

复数和虚数类型

C语言有3种复数类型:float_Complex、double_Complex和long double_Complex。例如,float_Complex类型的变量应该包含两个float类型的值,分别表示复数的实部和虚部。复数的实部和虚部类型都基于实浮点类型来构成。
C语言有3种虚数类型:float_Imaginary、double_Imaginary和long double_Imaginary。

以下整理出主要的数据类型表格:


  • 整型:
类型占用存储大小值范围
char1 字节-128 到 127 或 0 到 255
short2字节-32,768 到 32,767
int2 或 4 字节-32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
long4 字节-2,147,483,648 到 2,147,483,647
  • 布尔类型:
类型占用存储大小值范围
_Bool1位0或1
  • 可移植类型:
类型占用存储大小值范围
int32_t4字节-2,147,483,648 到 2,147,483,647
  • 浮点:
类型占用存储大小值范围精度
float4 字节1.2E-38 到 3.4E+386 位小数
double8 字节2.3E-308 到 1.7E+30815 位小数
  • 复数和虚数:
类型说明
float_Complex 
double_Complex 
float_Imaginary 
double_Imaginary 
  • 修饰符:
名称说明
signed有符号,即有负数,默认修饰符,可显式指定
unsigned无符号,即非负数全部为正数,最小为0
short更小类型数据,即被修饰的数据类型可以占用更少存储空间表示小范围值的整数
long更大类型数据,即被修饰的数据类型可以占用更大存储空间表示更大范围值的整数

标签: C/C++, C-Primer-Plus

添加新评论