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类型的溢出问题相关推荐

  1. java char 计算_经典Java面试题之Java中Char类型的运算

    经典Java面试题之Java中Char类型的运算 char在java中称为"字符型",占2个字节.本文是百分网小编搜索整理的关于经典Java面试题之Java中Char类型的运算,有 ...

  2. Oracle中CHAR类型不足位数时,用空格自动补足位数

    在今天开发过程中,发现了一查询结果很怪异,一GOOGLE下才知道是ORACLE对CHAR类型处理的问题,在ORACLE中对CHAR的处理是自动添加空格,比如char(8)存储'2007-11',则在后 ...

  3. java中char类型可以存储两个中文字符吗

    java中char类型只能存储一个中文字符 https://www.cnblogs.com/lchzls/p/7071862.html https://blog.csdn.net/qq_4264294 ...

  4. 达梦数据库迁移oracle数据乱码,oracle迁移到达梦数据库之存储过程中char类型的不同处理...

    oracle迁移到dm之存储过程中char类型的不同处理 1.问题描述: oracle迁移到dm后,oracle正常使用的存储过程,在dm中使用报错:字符串截断 2.查找原因: 2.1 对比oracl ...

  5. 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 ...

  6. oracle补齐字段,Oracle中CHAR类型自动补足空格的问题

    Oracle中CHAR类型自动补足空格的问题以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在ORACLE中 CHAR类 ...

  7. Java中char类型数组打印数组名输出结果不是地址值

    Java中其他类型数组打印数组名,输出结果都是内存地址 Java中char类型数组打印数组名,输出结果不是内存地址 char类型的数组就相当于一个字符串. 因为输出流System.out是PrintS ...

  8. java中char类型_【考点】JAVA中的char类型

    写在前面: 本周,在我们同学的刷题群里,一位同学上传了一道关于char的题,引起的不少同学的热议.热议的同时,我们也发现近乎一半的同学对char的基础知识一知半解,今天我们给大家一个浅显易懂的解释,赶 ...

  9. 经典Java面试题-Java中Char类型的运算

    [面试原题] 假设y是字符类型,初始化值为'b',那么以下语句输出的结果是什么? A.  System.out.println(++y); B.   System.out.println(y+1); ...

最新文章

  1. npm i和npm install的区别
  2. 联邦学习,为何而生?
  3. SQL批量修改字段值
  4. php数据仓库数据分析,利用Apache+PHP+MySql构建数据仓库
  5. joda time, jackson 与 scala 反射
  6. MAC 中python画图中文乱码
  7. 操作系统(二十九)预防死锁
  8. Java 8日期和时间
  9. AJPFX浅谈关于Java程序员缺乏面向对象的基本功的问题
  10. L2TP 配置实例——CALL LNS
  11. Linux下线程池概念详解以及代码演示
  12. 带你彻底击溃跳表原理及其Golang实现!(内含图解)
  13. Dreamweaver DW中清除代码中多余空行的方法(去除空行)
  14. 哈工大软件构造第一章总结
  15. java 工作流表单设计器 设计方案
  16. MySQL超详细学习教程,2023年硬核学习路线
  17. 云网融合相关研究现状
  18. python web和java web区别_成都汇智动力-谈谈个人认为的JavaWeb开发与PythonWeb开发的区别...
  19. 胡歌热播剧《猎场》遭差评 “程序猿”用自然语言分析揭真相
  20. Java Stream的流操作,居然让我的代码越写越丝滑?

热门文章

  1. 手机版的python-python手机版
  2. python 命令-python常见命令
  3. python详细基础教程-Python基础教程,Python入门教程(非常详细)
  4. python入门作业编程题-python入门(一)作业
  5. python到底可以做什么-Python到底可以做什么?
  6. python新手入门教程-终于知晓python新手练习教程
  7. python3爬虫实例代码-Python3爬虫带上cookie的实例代码
  8. python适合零基础学习吗-零基础能学好Python吗?哪些人更适合学习?
  9. 怎么安装python3-python3怎么安装
  10. 查看python安装路径-Mac查看Python安装路径和版本