登录  | 立即注册

游客您好!登录后享受更多精彩

扫一扫,访问微社区

QQ登录

只需一步,快速开始

开启左侧

[学习笔记] 关于整型数据溢出的探讨

[复制链接]
发表于 2017-1-22 16:32:50 | 显示全部楼层 |阅读模式
学习笔记
学习科目: C语言
学习安排: 学会举一反三
开始时间: 2017-01-21
结束时间:
本帖最后由 时光 于 2017-1-22 00:06 编辑

     首先要了解补码的概念,相信很多同学都知道,在这里再啰嗦一下。
      正整数的补码与原码相同,求负整数的补码时,符号位不变,数值位各位取反,最后整个数加1。
      补码变原码时两种方法,记其一即可:一是各数值为取反,末位加1,再转换为其他进制,二是                                                           
       末位减一,再取反转化其他进制。
            这是书上给出的一个溢出例 子                                                                                                
          [atta

1

1
[/attach]转化为二进制
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
   可以进行如表格中的计算,数据的存储都是以二进制方式储存的,所以这是-32768的补码形式。    那么我们可以进行稍微的改变,
                 

2

2

       这又是一种情况,整型类型符的数值范围有限,转化为二进制后进行加1,如下表
   
11 1 11 1 1 1 1 1 1 1 1 1 11
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
     b的值为第二行的二进制表示,而unsigned short占用2字节,共16位,所以取低16位,即b=0.
-  在看下一种
     

3

3

    或许有的人对这个不理解,本人当时也是,我仍按上述方法计算,如下表
... 0 0 0 0 0 0 0 0 0 0 0 0 00 0 0
... 1 1 1 1 1 1 1 1 1 1 1 1 1 1 11
      (这是我自己考虑的,就是为了凑出答案)就相当于普通的减法运算一样,向前进一位(注意是二进制的减法)
                同理    

4

4
        
           规律就是 一个类型符取值范围中  最大值+1=最小值,最小值-1=最大值。
                                      VC中整形变量的所占字节和取值范围
整形类型符 占用字节数数值范围
int4 -2^31~(2^31-1)
short int 2 -32768~32767
long int 4 -2^31~(2^31-1)
unsigned int4 0~(2^32-1)
unsigned short2 0~65535
unsigned long 4 0~(2^32-1)
  (以上是我个人理解,如有错误,请各位指正)

...
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表