C++中char类型的溢出问题
C++中什么经常会运用到char类型,也会将char类型作为循环语句的循环条件,但往往这里最容易出现错误,容易出现溢出,进入死循环。这里我们就来简单介绍下为什么会出现这种情况。
首先,了解下char类型的取值范围:
char分为无符号(unsigned)和有符号(signed)两种:
无符号(unsigned)的取值范围:0~255;
有符号(signed)的取值范围为:-128~127.
一般我们常用char来声明一个变量,编译器默认为有符号的,即范围为:-128~127.
常见溢出问题:
知道了char类型的取值范围后,就容易理解为什么会出现溢出了。出现溢出的地方很多都是因为将char类型的变量作为了循环语句的条件部分,这样就很容易出现溢出,这里讲解一下char类型的自增情况。
一般作为循环条件时,char类型往往被赋值了int类型,如char i = 0,然后i进行自增。
当i是无符号型时,取值范围为-128 ~ 127,当i=127后再进行自增的时候,这时i就不是等于128了,而是等于-128;当i= -128,再进行自减的时候就不是等于-129,而是等于127.
当i是有符号型的时候,取值范围为0 ~ 255,当i = 255时,再进行自增,这时i=0,而不是等于256;当i=0,进行自减的时候i= 255,而不是-1.
这是因为char型对于有符号型,前24位永远和倒数第8位一样,对于无符号型,前24位永远为零。
造成上面的结果的原因:
当为有符号型时,当i = 127时,二进制为:0....0 0111 1111,然后加1后,按照上面的原理,变为:1....1 1000 0000,结果i = -128;当i=-128时,减1,二进制变为:0....0 0111 1111,结果i = 127.
当为无符号时,当i=255时,二进制为:0....0 1111 1111,加1后,按照上面的原理,变为:0....0 0000 0000 ,结果为i= 0;当i = 0时,减1,二进制为:0...0 1111 1111,结果为255.
下面通过一个实例来说明:
#define s8 char
static int k = 0;
void func()
{s8 i = 0;for(i = 0; i < 128; i++){k += i&3;}printf("k = %d\n", k);
}
这里很多人可能会动笔就计算,算得 k= 192,但结果是错的。
原因:注意i为一个char类型,且为有符号型,并被赋初值0,这里当i = 127的时候,程序会正常进行,然后i自增,变为-128,最后还是满足条件,程序并不会终止,这样就出现了char类型的溢出,程序进入死循环。此时,要么改变循环中的条件,改为:i < 127;或者将i的类型改为int型。
转载于:https://www.cnblogs.com/pengjun-shanghai/p/5523263.html
C++中char类型的溢出问题相关推荐
- java char 计算_经典Java面试题之Java中Char类型的运算
经典Java面试题之Java中Char类型的运算 char在java中称为"字符型",占2个字节.本文是百分网小编搜索整理的关于经典Java面试题之Java中Char类型的运算,有 ...
- Oracle中CHAR类型不足位数时,用空格自动补足位数
在今天开发过程中,发现了一查询结果很怪异,一GOOGLE下才知道是ORACLE对CHAR类型处理的问题,在ORACLE中对CHAR的处理是自动添加空格,比如char(8)存储'2007-11',则在后 ...
- java中char类型可以存储两个中文字符吗
java中char类型只能存储一个中文字符 https://www.cnblogs.com/lchzls/p/7071862.html https://blog.csdn.net/qq_4264294 ...
- 达梦数据库迁移oracle数据乱码,oracle迁移到达梦数据库之存储过程中char类型的不同处理...
oracle迁移到dm之存储过程中char类型的不同处理 1.问题描述: oracle迁移到dm后,oracle正常使用的存储过程,在dm中使用报错:字符串截断 2.查找原因: 2.1 对比oracl ...
- Java基础题37:(单选题)java中char类型的取值范围是() A.0 ... 32767 B.0 ... 65535
37.(单选题)java中char类型的取值范围是() A.0 - 32767 B.0 - 65535 C.–256 - 255 D.–32768 - 32767 [正确答案]B [答案解析]在jav ...
- oracle补齐字段,Oracle中CHAR类型自动补足空格的问题
Oracle中CHAR类型自动补足空格的问题以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在ORACLE中 CHAR类 ...
- Java中char类型数组打印数组名输出结果不是地址值
Java中其他类型数组打印数组名,输出结果都是内存地址 Java中char类型数组打印数组名,输出结果不是内存地址 char类型的数组就相当于一个字符串. 因为输出流System.out是PrintS ...
- java中char类型_【考点】JAVA中的char类型
写在前面: 本周,在我们同学的刷题群里,一位同学上传了一道关于char的题,引起的不少同学的热议.热议的同时,我们也发现近乎一半的同学对char的基础知识一知半解,今天我们给大家一个浅显易懂的解释,赶 ...
- 经典Java面试题-Java中Char类型的运算
[面试原题] 假设y是字符类型,初始化值为'b',那么以下语句输出的结果是什么? A. System.out.println(++y); B. System.out.println(y+1); ...
最新文章
- npm i和npm install的区别
- 联邦学习,为何而生?
- SQL批量修改字段值
- php数据仓库数据分析,利用Apache+PHP+MySql构建数据仓库
- joda time, jackson 与 scala 反射
- MAC 中python画图中文乱码
- 操作系统(二十九)预防死锁
- Java 8日期和时间
- AJPFX浅谈关于Java程序员缺乏面向对象的基本功的问题
- L2TP 配置实例——CALL LNS
- Linux下线程池概念详解以及代码演示
- 带你彻底击溃跳表原理及其Golang实现!(内含图解)
- Dreamweaver DW中清除代码中多余空行的方法(去除空行)
- 哈工大软件构造第一章总结
- java 工作流表单设计器 设计方案
- MySQL超详细学习教程,2023年硬核学习路线
- 云网融合相关研究现状
- python web和java web区别_成都汇智动力-谈谈个人认为的JavaWeb开发与PythonWeb开发的区别...
- 胡歌热播剧《猎场》遭差评 “程序猿”用自然语言分析揭真相
- Java Stream的流操作,居然让我的代码越写越丝滑?
热门文章
- 手机版的python-python手机版
- python 命令-python常见命令
- python详细基础教程-Python基础教程,Python入门教程(非常详细)
- python入门作业编程题-python入门(一)作业
- python到底可以做什么-Python到底可以做什么?
- python新手入门教程-终于知晓python新手练习教程
- python3爬虫实例代码-Python3爬虫带上cookie的实例代码
- python适合零基础学习吗-零基础能学好Python吗?哪些人更适合学习?
- 怎么安装python3-python3怎么安装
- 查看python安装路径-Mac查看Python安装路径和版本