今天复习到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++整型,定义、表示、范围,再看整型相关推荐

  1. 定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数;然后按顺序每五个数求出一个平均值,放在另一个数组中并输出。

    定义一个含有30个整型元素的数组,按顺序分别赋予从2开始的偶数:然后按顺序每五个数求出一个平均值,放在另一个数组中并输出. var arr = [];for (var i = 1; i <= 6 ...

  2. java长整型定义和输出_Java数据类型及使用方法

    原标题:Java数据类型及使用方法 一.基本数据类型 整型:byte.short.int.long (在计算机中以二进制补码格式存储) 浮点型:float.double (在计算机中以IEEE754格 ...

  3. C语言输出长长整型错误,c语言长整型定义

    我用long int怎么不行呢 基本定义形式为: long var_name = INIT_VALUE; 一. 长整型在C语言中类型关键字为long. 定义时,var_name为变量名. INIT_V ...

  4. python中整型_实例介绍Python中整型

    实例介绍Python中整型 Python中有以下几个基本的数据类型: 整数 int 字符串 str 浮点数 float 集合 set 列表 list 元组 tuple 字典 dict 布尔类型 boo ...

  5. java长整型转换为整型_java ip地址转换为长整型

    java ip地址转换为长整型 java ip地址转换为长整型: public class Util { /** * 字符串ip转换为long * @param 字符串ip * @return */ ...

  6. scala 定义空的list_18.scala的型变

    型变是复杂类型的子类型关系与其组件类型的子类型关系的相关性.Scala支持 泛型类 的类型参数的型变注释,允许它们是协变的,逆变的,或在没有使用注释的情况下是不变的.在类型系统中使用型变允许我们在复杂 ...

  7. python k线顶分型_【缠论】分型、笔的定义及其程序化

    K线包含关系处理和分型的定义 如果一个K线的高低点全在另一K线的范围里,称之为包含关系.针对这种K线,需要进行一些处理,去除包含关系,处理方法:向上时,把两K线的高点当高点,而两K线低点中的较高者当成 ...

  8. 编写程序定义一个有 10 个 int 型元素的数组,并以其在数组中的位置作为各元素的初值。

    *编写程序定义一个有 10 个 int 型元素的数组,并以其 在数组中的位置作为各元素的初值.*/ int main(void) {     int array[10];     for (int i ...

  9. 关于第一型曲面积分的再思考

    关于第一型曲面积分的再思考 @(微积分) 有些问题,看着复杂,却很好解.同样,有些问题看着很简单,但是却很难下手.举一个关于第一型曲面积分计算的例子. 第一型曲面积分基础解法要干三件事: 投影 代入 ...

  10. python整形是什么,什么是整型?怎样理解Python的整型?

    整数类型(int)简称整型,它用于表示整数,例如,100.2016等.整型字面值的表示方式有四种,分别是十进制.二进制(以"0B"或"0b"开头).八进制(以数 ...

最新文章

  1. 手把手教你React(一)JSX与虚拟DOM
  2. .net项目发布到本地IIS
  3. 3288 android5.1 编译,RK3288編譯 Android 5.1 固件
  4. Linux sed 写命令常见使用案例
  5. ubantu 16.04 mysql_Ubuntu 16.04下安装MySQL
  6. 【AngularJS】—— 8 自定义指令
  7. leetcode 911. Online Election | 911. 在线选举(加强堆 + 二分查找)
  8. 关于5G技术和5G技术即将面临的各项挑战
  9. 1062. Talent and Virtue (25)
  10. 企业3级推广报单分销源码下载会员注册管理系统
  11. python-文件的读写操作-入门-0225
  12. sql缩进提高语句的可读性_为什么要使用列缩进来提高代码的可读性
  13. 巧妙解决AJAX跨域问题
  14. 评选 cms_十大评选和编辑精选:12月评论
  15. 字符串 拼接方法报错 not defined
  16. uniapp消息推送
  17. [论文阅读] SASA: Semantics-Augmented Set Abstraction for Point-based 3D Object Detection
  18. iOS App版本更新并上架App Store
  19. 大事发生,程序员一直在守护世界
  20. Qt中的C++技术 张波

热门文章

  1. 谷歌浏览器js报错:Uncaught (in promise) DOMException
  2. 常用三大java框架
  3. linux内存中的文件权限,理解Linux文件权限
  4. JAVA喝咖啡的关系_写完java就去喝咖啡,很合适。
  5. android原生请求权限,ReactNative调用Android原生中的权限请求
  6. 留言板分页php,php留言板代码[经典的分页代码](1/4)
  7. SQL:postgresql点geom转换为经纬度、POINT
  8. Javascript特效:普通轮播图
  9. linux远程控制本地用户登录,linux 本地无法登录 远程可以登陆的解决办法
  10. 7z增量更新参数使用