3.1.2 整型

整数就是没有小数部分的数字,如-2、98、-5286和0.整数有很多,如果将无限大的整数看作很大,则不可能用有限的计算机内存来表示所有的整数。因此,语言只能表示所有整数的一个子集。有些语言只提供一种整型(一种类型满足所有要求!),而C++则提供好几种,这样便能根据程序的具体要求选择最合适的整型。

不同C++整型使用不同的内存量来存储整数。使用的内存量越大,可以表示的整数值范围也越大。另外,有的类型(符号类型)可表示正值和负值。而有的类型(无符号类型)不能表示负值。术语宽度用于描述存储整数时使用的内存量。使用内存越多,则越宽。C++的基本类型(按宽度递增的顺序排列)分别是char、short、int、long和C++11新增的long long,其中每种类型都有有符号版本和无符号版本,因此总共有10种类型可供选择。下面更详细的介绍这些整数类型。由于char类型有一些特殊属性(它最常用来表示字符,而不是数字),因此本章将首先介绍其他类型。

3.1.3 整型short、int、long和long long

计算机内存由一些叫做位(bit)的单元组成(参见本章后面的旁注“位与字节”)。C++的short、int、long和long long类型通过使用不同数目的位来存储值,最多能够表示4种不同的整数宽度,如果在所有的系统中,每种类型的宽度都相同,则使用起来将非常方便。例如short总是16位,int总是32位,等等。不过生活并非那么简单,没有一种选择能够满足所有的计算机设计要求。C++提供了一种灵活的标准,它确保了最小长度(从C语言借鉴而来),如下所示:

short至少16位;

int 至少与short一样长

long至少32位,且至少与int一样长

long long至少64位,且至少与long一样长

位于字节

计算机内存的基本单位是位(bit)。可以将位看作电子开关,可以开,也可以关。关表示值0,开表示值1。8位的内存快可以设置出256种不同的组合,因为每一位都可以有两种设置,所以8位的总组合数为2*2*2*2*2*2*2*2,即256。因此,8位单元可以表示0-255或者-128到127.每增加一位,组合数便加倍。这意味着可以把16位单元设置出65536个不同的值,把32位单元设置成4294672296个不同的值,把64位单元设置位18 446 744 073 709 551 616 个不同的值。作为比较,unsigned long 存储不了地球上当前的人数和银河系的星星数,而long long 能够.

字节(byte)通常指的是8位的内存单元。从这个意义上说,字节指的就是描述计算机内存量的度量单位,1KB等于1024字节,1MB等于1024KB。然而,C++对字节的定义与此不同。C++字节由至少能够容纳显示的基本字符集的相邻位组成,也就是说,可能取值的数目必须等于或超过字符数目。在美国,基本字符集通常是ASCII和EBCDIC 字符集,它们都可以用8位来容纳,所以在使用这两种字符集的系统中,C++字节通常包含8位。然而,国际编程可能需要使用更大的字符集,如Unicode,因此有些实现可能使用16位甚至32位的字节。有些人使用术语八位组(octet)表示8位字节。

当前很多系统都使用最小长度,即short为16位,long为32位。这仍然为int提供了多种选择,其宽度可以是16位、24位或32位,同时有符合标准:甚至可以是64位,因为long和long long至少长64位。通常,再老式IBM PC的实现中,int的宽度位16位(与short相同),而在Windows XP、Windows vista、Windows 7、Macintosh OS X、VAX和很多其他微型计算机的实现中,为32位(与long相同)。有些实现允许选择如何处理int。(浏览者所用的实现使用的是什么?下面的例子将演示如何再不打开手册的情况下,确定系统的限制。)类型的宽度随显示而异,这可能在将C++程序从一种环境移到另一种环境(包括在同一个系统中使用不同编译器)是引发的问题。但只要小心一点(如本章后面讨论的那样),就可以最大限度地减少这种问题。

可以像使用int一样,使用这些类型名来声明变量:

short score;
int temperature;
long position;

实际上,short是short int 的简称,而long是long int的简称,但是程序设计者们几乎都不使用比较长的形式。

这4种类型(int、short、long和long long)都是符号类型,这意味着每种类型的取值范围中,负值和正值几乎相同。例如,16位的int的取值范围-32768到+32767。

要知道系统中整数的最大长度,可以在程序中使用C++工具来检查类型的长度。首先sizeof运算符返回类型或变量的长度,单位为字节(运算符是内置的语言元素,对一个或多个数据进行运算,并生成一个值。例如,加号运算符+将两个值相加)。前面说过,“字节”的含义依赖于实现,因此在一个系统中,两字节的int可能是16位,而在另一个系统中可能是32位。其次,头文件climits(在老式实现中为limits.h)中包含了关于整数限制的信息。具体地说,它定义了表示各种限制的符号名称。例如,INT_MAX为int的最大取值,CHAR_BIT为字节的位数。程序3.1演示了如何使用这些工具。该程序还演示如果初始化,即使用声明语句将赋值给变量。

程序3.1  limits.cpp

//limits.cpp——some integer limits
#include<iostream>
#include<climits>
int main()
{using namespace std;int n_int=INT_MAX;short n_short=SHRT_MAX;long n_long=LONG_MAX;long long n_llong=LLONG_MAX;cout<<"int is "<<sizeof(int)<<" bytes."<<endl; cout<<"short is "<<sizeof n_short<<" bytes."<<endl; cout<<"long is "<<sizeof n_long<<" bytes."<<endl; cout<<"long long is "<<sizeof n_llong<<" bytes."<<endl; cout<<endl;cout<<"Maximum values:"<<endl;cout<<"int: "<<n_int<<endl;cout<<"short: "<<n_short<<endl;cout<<"long: "<<n_long<<endl;cout<<"long long: "<<n_llong<<endl<<endl;cout<<"Minimum int value="<<INT_MIN<<endl;cout<<"Bits per byte= "<<CHAR_BIT<<endl;return 0;
} 

注意:如果您的系统不支持类型long long ,应删除使用该类型的代码行。

下面是程序3.1中程序的输出:

这些输出来自运行64位 Windows 10的系统(是楼主的电脑了,数据会根据系统的不同而不同)。我们来看下该程序的主要编程特性。

1、运算符sizeof和头文件limits

sizeof运算符指出,在使用8位字节的系统中,int的长度为4个字节。可对类型名或变量名使用sizeof运算符。对类型名(如int)使用sizeof运算符时,应将名称放在括号中;但对变量名(如n_short)使用该运算符,括号是可选的:

cout<<”int is ”<<sizeof(int)<<” bytes.\n”;
cout<<”short is”sizeof n_short<<” bytes.\n”;

头文件climits定义了符号常量(参见本章后面的旁注“符号常量——预处理器方式”)来表示类型的限制。如前所述,INT_MAX表示类型int能够存储的最大值,对于Windows 10 系统,为2 147 483 647。编译器厂商提供了climits文件,该文件指出了其编译器中的值。例如,在使用16位int的老系统中,climits文件将INT_MAX定义位32767。表3.1对该文件中定义的符号常量进行了总结,其中一些符号常量与还没有介绍过的类型相关。

表3.1                     climits中的符号常量

符号常量

表示

CHAR_BIT

char的位数

CHAR_MAX

char的最大值

CHAR_MIN

char的最小值

SCHAR_MAX

signed char 的最大值

SCHAR_MIN

signed char 的最小值

UCHAR_MAX

unsigned char 的最大值

SHRT_MAX

short 的最大值

SHRT_MIN

short的最小值

USHRT_MAX

unsigned short 的最大值

INT_MAX

int的最大值

INT_MIN

int的最小值

UNIT_MAX

unsigned int 的最大值

LONG_MAX

long的最大值

LONG_MIN

long的最小值

ULONG_MAX

unsigned long的最大值

LLONG_MAX

long long的最大值

LLONG_MIN

long long的最小值

ULLLONG_MAX

unsigned long long 的最大值

符号常量——预处理器方式

climits文件中包含于下面类似的语句行:

#define INT_MAX 32767

在C++编译过程中,首先将源代码传递给预处理器。在这里,#define和#include一样,也是一个预处理器编译指令。该编译指令告诉预处理器:在程序中查找INT_MAX,并将所有的INT_MAX都替换为32767。因此#define编译指令的工作方式于文本编译器或字处理器中的全局搜索并替换命令相似。修改后的程序将在完成这些替换后被编译。预处理器查找独立的标记(单独的单词),跳过嵌入的单词。也就是说,预处理器不会将PINT_MAXTM替换为P32767M.也可以使用#define来定义自己的符号常量(参见程序3.2)。然而,#define编译指令是C语言遗留下来的。C++有一样更好的创建符号常量的方法(使用关键字const,将在后面的一节讨论),所以不会经常使用#define。然而,有些头文件,尤其是那些被设计成可用于C和C++中的头文件,必须使用#define。

2、初始化

初始化将赋值于声明合并在一起,例如,下面的语句声明了变量n_int,并将int的最大值赋给它:

int n_int = INT_MAX;

也可以使用字面值常量来初始化。可以将变量初始化为另一个变量,条件是后者已经定义过。甚至可以使用表达式来初始化变量,条件是当程序执行到该声明时,表达式中所有的值都是已知的:

int uncles =5 ;

int aunts = uncles;

int chairs = aunts + uncles + 4;

如果将uncles的声明移到语句列表的最后,则另外两条初始化语句将非法,因为这样当程序试图对其他变量进行初始化是,uncles的值是未知的。

前面的初始化语法来自C语言,C++还有另一种C语言没有初始化语法:

int owls = 101;

int wrens(432);

警告:如果不对函数内部定义的变量进行初始化,该变量的值将是不确定的。这意味着该变量的值将是它被创建之前,相应内存单元保存的值。

如果知道变量的初始值应该是什么,则应对它进行初始化,将变量声明和赋值分开,可能会带来瞬间悬而未决的问题:

short years;

years = 1492;

然而,在声明变量时对它进行初始化,可避免以后忘记给它赋值的情况发生。

1、C++11初始化方式

还有另一种初始化方式,这种方式用于数组和结构,但在C++98中,也可用于单值变量:

int hamburgers ={24};

将大括号初始化器用于单值变量的情形还不多,但C++11标准使得这种情形更多了。首先,采用这种方式时,可以使用等号(=),也可以不适用:

int emus{7};

int rheas = {12};

其次,大括号内可以不包含任何东西。在这种情况下,变量将被初始化为零:

int rocs ={};

int psychics{};

第三,这有助于更好地防范类型转换错误,这个主题酱紫啊本章末尾讨论。

为何需要更多的初始化方法?有充分的理由吗?原因是让新手更容易学习C++,这可能有些奇怪。以前,C++使用不同的方式来初始化不同的类型:初始化类变量的方式不同于初始化常规结构的方式,而初始化常规结构的方式又不同于初始化简单变量的方式:通过使用C++新增的大括号初始化器,初始化常规变量的方式于初始化类变量的方式更像。C++11使得可将大括号初始化器用于任何类型(可以使用等号,也可以不使用),这是一种通用的初始化语法。以后,我可能介绍使用大括号进行初始化的方式,并出于向后兼容的考虑,顺便提及其他初始化方式。

16-C++-基础-整型short、int、long和long long相关推荐

  1. c++基本数据类型基本类型: 整型: 短整型: short int 整型: int 长整型:long int 字符型:char(分为有符号和无符号,默认有符号) 浮点型:

    基本类型: 整型: 短整型: short int 整型: int 长整型:long int 字符型:char(分为有符号和无符号,默认有符号) 浮点型:单精度型:float 双精度型:double 长 ...

  2. C语言学习6:数据类型 -> 基本类型 -> 整型类型(int、short int、long int、char等)

    目录 1.数据类型的分类 2.基本整型 int 3.短整型 short int 4.长整型 long int 5.双长整型 long long int 6.字符型 char 7.布尔型 bool 1. ...

  3. c语言字符型和浮点型相加,C语言基础 整型、字符型和浮点型

    1.整型数据类型 C定义了5种整型数据类型. 整型数据类型表 序号 类型名称 说明 字节数 取值范围 1 signed char 有符号的单字节整数类型 1 -128~+127 2 short int ...

  4. (6)关于整型short、int、long和long long

    书籍:<C++ Primer Plus 第6版>第三章: C++对整型short.int.long和long long的长度规则定义如下: - short 至少16位: - int 至少和 ...

  5. 【贪玩巴斯】带你学:C++ tips ——知识点: C++整型short,int,long和long long的区别 2021年12月20日

    [贪玩巴斯]带你学:C++ tips --知识点: C++整型short,int,long和long long的区别 2021年12月20日 C++的整型有short,int,long和long lo ...

  6. 10进制整型转16进制整型?

    探究10进制整型转16进制整型 1).16进制字符串与整型的互换: String str="1A";         int t=Integer.parseInt(str, 16) ...

  7. mysql 短整型_C++ int,short,long(详解版)

    C++ 有许多不同类型的数据.变量根据其数据类型进行分类,并确定可能存储在其中的信息种类.在这些数据类型中,整型变量只能保存整数. 计算机程序从现实世界收集数据,并以各种方式操作它们.有许多不同类型的 ...

  8. java长整型数输入格式_java编程之计算16位长整型数字中0-9出现次数(从命令窗输入数据)...

    /* *读入一个16位的长整型,利用switch语句计算0-9这十个数字中,每个字出现的次数 **/ import java.util.Scanner; class number{ public st ...

  9. 整型(int)转时间格式字符串及页面long型转时间格式字符串

    1,如果是封装的整型的话需要在后台进行处理再返回页面 处理过程是这样的 SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm ...

最新文章

  1. 微软宣布正式开源 Azure IoT Edge 边缘计算服务
  2. 《转》从程序员到项目经理(五):不是人人都懂的学习要点
  3. python关闭读写的所有的文件-Python读写txt文本文件的操作方法全解析
  4. 音视频技术开发周刊 75期
  5. elasticsearch index doc过程概述
  6. 大湾区第二次.NET技术交流会圆满成功
  7. 【今日CV 视觉论文速览】Fri, 15 Feb 2019
  8. Python_urllib
  9. OpenShift 4 - DevSecOps Workshop (13) - 将镜像推送到Quay,并进行漏洞扫描
  10. XP命令合集(开始→运行→输入的命令集锦开始→运行→输入的命令集锦)
  11. java 删 除文件操作,C语言 File文件处理 删除文件
  12. User-Agent 及其构造
  13. Give root password for maintenance 问题的解决方法
  14. 从周五开始美国服务器特别慢,美国服务器用户有同感吗?...
  15. 在函数内对带副作用的运算符 rand 的使用无效。_如何成体系掌握Excel函数(一)...
  16. 企业财务分析一头雾水?有了这个财务报表工具,问题一键解决
  17. 阿拉伯数字 - 书法 - 详解
  18. 一个测试工程师走进一家酒吧……
  19. CSP-J冲刺 P1359 租用游艇
  20. 如何卸载流氓软件Avast

热门文章

  1. C#中sealed的用法
  2. 万兆电口网卡性能分析
  3. 转 大数据量下载解决方案
  4. 用Wireshark抓包分析协议 计算机网络
  5. 单源最短路径dijkstra算法
  6. 加入先进制造的追光者-探索现代机械设计团队的高效协作方式
  7. Jemter+Badboy实战经验一(Badboy录制及基础功能)
  8. k8s学习笔记——ceph rbd本地手动挂载
  9. 卷积神经网络架构不包含,卷积神经网络架构分析
  10. 英语计算机主板接口有,主板上常见英文的解释