C/C++整型,定义、表示、范围,再看整型
今天复习到C++的变量与基本类型,再看整形。
一般情况下,我们会认为表示整数的数据类型叫做是整型,但实际上,C++中的整型包括表示整数、字符和布尔值的算术类型。理解这一点很简单,首先,整数就是通常指的整数,比如-655536,-200,-100,0,50,65535等;而字符char类型的数据也是可以参加算术运算的,比如,字符'a'等于整型97的,可通过if('a'==97) cout<<"Yes"<<endl;验证,程序输出是YES,表示字符'a'与整数97是相等的;布尔bool类型也是可以参与算术运算的,例如,char a = 'a';bool b = true;printf("%d\n",a+b);则输出的结果是98,表示a=97,b=1,而输出是(97+1)==98;因此,严格的来说,整型是表示整数、字符和布尔值等算术类型的合称。对于C++语言而言,整型就是包括整数型、字符型、布尔型。
整数型有:short、int、long等三种,其中,int为默认的整型,int类型的数据是一个机器字长,即你的CPU处理的位数,假设你的CPU是32位的,则一个int就是4个字节。short类型是半个机器字长,则为int的一半;而long则为通常是一或者两个机器字长,但在32位机器中,通常int与long是相同的,所以sizeof(int)==sizeof(long)==4是正确的。
字符类型有:char和wchar_t两种,其中,char为大家所知的单字节数据类型,8位数据。wchar_t是C++定义的,用于保存扩展字符集的,比如中文字符,实际上wchar_t是用unsigned short类型来定义数据的。
布尔类型:用bool关键字来申明,其值只有真和假,即true和false,true的int类型值为1,false的int类型值为0。0值算术类型都代表着false,而任何非0值都代表着true。布尔类型通常正规的定义和初始化如,bool b = true,当然也可以定义和初始如bool b1=1,bool b2='b'等等;然而,假设有程序 bool b = 'b';cout<<b<<endl;printf("%c\n",b);则程序输出为1和@脸型符号@,为什么不是98或者true或者'b',这不仅说明了任何非0数值都是true,而且也证明了bool类型的true值就是1,所以,任何值为true的bool值输出总是为1,而将1作为字符输出时就是@脸型字符@。这个例子也证明了在本人发表的随笔《if语句,C、C++、Java》一文中提到的,if(“xxxx”)内的条件表达式是true的原因。
不过,通常来说,整型主要是用以描述整数的,这种说法比较通用化,对于其他编程语言来说也是友善的说法。比如在java语言中,算术类型之间的转换还是必须严格的按照强制转型进行的。
整型(除bool类型外)可以分为带符号signed和无符号unsigned类型。带符号类型signed可以表示正负数、0,而无符号数则只能表示0和正数。默认情况下是带符号数的,例如 int i;相当于signed int i; 而要定义无符号数必须显示在前面加上unsigned加以说明,例如,unsigned int i。然而,对于char类型,char类型可以有三种类型:普通char、signed char和unsigned char,即便如此,char类型只有两种表示方式,即signed char和unsigned char。
带符号数与无符号数的区别在于,带符号数使用数据中的最高位作为符号位,剩余的坐数据位,而无符号数则使用全部的位bit作为数据位。假设以8位为例,则无符号数据使用全部的8位来表示数据,则数据的表示范围从0—255。而带符号使用最高位(第7位,从0位开始算)为符号位,该位若是1则表示负数,若是0表示正数,剩下的7位用来表示数据,则数据表示范围从-128—127。
整型是有表示范围的,那么如果在整型赋值时超过了类型所表示的范围,会有什么发生呢?
那么我们来看看以下几个程序。(条件:实验机器是32位)
第一题:
short i = (short)65535;
printf("%d\n",i);
程序输出的是:-1.
第二题:
short i = (short)65538;
printf("%d\n",i);
程序输出的是:2.
第三题:
short i = (short)-32769;
printf("%d\n",i);
程序输出的是:32767
为什么这样?为什么输出的不是我们赋予的预期值?
当然,这是赋予的值超出了数据的表示范围导致的。那么,为什么得到这样的值?
现在我们针对第一题,首先我们将65535十六进制表示为0xffff,转化为二进制是11111111 11111111刚好是16位,short类型是半个机器字长,因此为16位。由于此时i被定义为带符号数,最高位(第15位为1,负数),0xffff则正是-1的在机器中的补码。所以,输出刚好是-1。如果程序改为:
unsigned short i = (short)65535;
printf("%d\n",i);
则输出正好是65535;
针对第二题,变量i同样定义为带符号,首先将65538转换为二进制,则为1 00000000 00000010是17位二进制,由于short类型只有16位,因此,只截取出后16位00000000 00000010,可见,结果正式带符号数+2。那么,如果把i定义为无符号数,或输出什么呢?还会是+2吗?同样的道理,17位二进制中,只照截取00000000 00000010部分,而无符号数只是把最高位算进数据位中,固然,00000000 00000010整体还是2。
针对第三题,首先我们将-32769用二进制补码表示为1 01111111 11111111是17位,因此,截取后16位01111111 11111111,而后16位的带符号数就是+32767。这就是为什么会得到这样的一些结果了。
偶然复习到C++的整型,结合一些自身经验,再看C/C++整型罢,欢迎指正!
转载于:https://www.cnblogs.com/sl-shilong/archive/2012/11/21/2781788.html
C/C++整型,定义、表示、范围,再看整型相关推荐
- 定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数;然后按顺序每五个数求出一个平均值,放在另一个数组中并输出。
定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数:然后按顺序每五个数求出一个平均值,放在另一个数组中并输出. var arr = [];for (var i = 1; i <= 6 ...
- java长整型定义和输出_Java数据类型及使用方法
原标题:Java数据类型及使用方法 一.基本数据类型 整型:byte.short.int.long (在计算机中以二进制补码格式存储) 浮点型:float.double (在计算机中以IEEE754格 ...
- C语言输出长长整型错误,c语言长整型定义
我用long int怎么不行呢 基本定义形式为: long var_name = INIT_VALUE; 一. 长整型在C语言中类型关键字为long. 定义时,var_name为变量名. INIT_V ...
- python中整型_实例介绍Python中整型
实例介绍Python中整型 Python中有以下几个基本的数据类型: 整数 int 字符串 str 浮点数 float 集合 set 列表 list 元组 tuple 字典 dict 布尔类型 boo ...
- java长整型转换为整型_java ip地址转换为长整型
java ip地址转换为长整型 java ip地址转换为长整型: public class Util { /** * 字符串ip转换为long * @param 字符串ip * @return */ ...
- scala 定义空的list_18.scala的型变
型变是复杂类型的子类型关系与其组件类型的子类型关系的相关性.Scala支持 泛型类 的类型参数的型变注释,允许它们是协变的,逆变的,或在没有使用注释的情况下是不变的.在类型系统中使用型变允许我们在复杂 ...
- python k线顶分型_【缠论】分型、笔的定义及其程序化
K线包含关系处理和分型的定义 如果一个K线的高低点全在另一K线的范围里,称之为包含关系.针对这种K线,需要进行一些处理,去除包含关系,处理方法:向上时,把两K线的高点当高点,而两K线低点中的较高者当成 ...
- 编写程序定义一个有 10 个 int 型元素的数组,并以其在数组中的位置作为各元素的初值。
*编写程序定义一个有 10 个 int 型元素的数组,并以其 在数组中的位置作为各元素的初值.*/ int main(void) { int array[10]; for (int i ...
- 关于第一型曲面积分的再思考
关于第一型曲面积分的再思考 @(微积分) 有些问题,看着复杂,却很好解.同样,有些问题看着很简单,但是却很难下手.举一个关于第一型曲面积分计算的例子. 第一型曲面积分基础解法要干三件事: 投影 代入 ...
- python整形是什么,什么是整型?怎样理解Python的整型?
整数类型(int)简称整型,它用于表示整数,例如,100.2016等.整型字面值的表示方式有四种,分别是十进制.二进制(以"0B"或"0b"开头).八进制(以数 ...
最新文章
- 手把手教你React(一)JSX与虚拟DOM
- .net项目发布到本地IIS
- 3288 android5.1 编译,RK3288編譯 Android 5.1 固件
- Linux sed 写命令常见使用案例
- ubantu 16.04 mysql_Ubuntu 16.04下安装MySQL
- 【AngularJS】—— 8 自定义指令
- leetcode 911. Online Election | 911. 在线选举(加强堆 + 二分查找)
- 关于5G技术和5G技术即将面临的各项挑战
- 1062. Talent and Virtue (25)
- 企业3级推广报单分销源码下载会员注册管理系统
- python-文件的读写操作-入门-0225
- sql缩进提高语句的可读性_为什么要使用列缩进来提高代码的可读性
- 巧妙解决AJAX跨域问题
- 评选 cms_十大评选和编辑精选:12月评论
- 字符串 拼接方法报错 not defined
- uniapp消息推送
- [论文阅读] SASA: Semantics-Augmented Set Abstraction for Point-based 3D Object Detection
- iOS App版本更新并上架App Store
- 大事发生,程序员一直在守护世界
- Qt中的C++技术 张波
热门文章
- 谷歌浏览器js报错:Uncaught (in promise) DOMException
- 常用三大java框架
- linux内存中的文件权限,理解Linux文件权限
- JAVA喝咖啡的关系_写完java就去喝咖啡,很合适。
- android原生请求权限,ReactNative调用Android原生中的权限请求
- 留言板分页php,php留言板代码[经典的分页代码](1/4)
- SQL:postgresql点geom转换为经纬度、POINT
- Javascript特效:普通轮播图
- linux远程控制本地用户登录,linux 本地无法登录 远程可以登陆的解决办法
- 7z增量更新参数使用