zoukankan      html  css  js  c++  java
  • 回首c语言:了解char的取值范围及数据越界问题

    近来一直在学习python之类的高级语言,前几天被一个学弟问了C语言中关于char的一系列问题

    结果一时回答不上来,毕竟很久没有复习最基础但是也是最讲究是C语言了,遂抽出不分时间开始温习C语言数据类型,经过研究得出下列结论。

    首先放出问题:

    1.char的取值范围是多少,为什么是这样。

    2.如何用程序数出int类型的最大数字。

    在看接下来的答总结的时候,也先请大家仔细思考一下,题目看似简单,实则需要结合原码,反码和补码问题才能解决。

    首先明确一点:

    无论是char short int float还是double,他们存储数字的方式都是将原数以补码的形式放入到内存中的,他们的补码最左边的一位都是用来表示正负的:1表示负数,0表示正数。

    char在C语言中是占用1个字节的,一个字节是8bit,也就是8位,

    当我们用char表示”1“这个数字的时候,其补码形式就是 0000 0001。

    先看char可以表示的最大正整数

    char能表示的最大的正整字就是0111 1111,这个二进制数转化为十进制就是:

    这里由等比数列前N相和公式可以算出来正整数最大表示的是2^7-1=127

    所以,正整数最高为127,则负整数最小就是-127吗?由此乐意确定char的表达范围是-127——0——127了吗?

    答案是不,接下来看:

    我们这里看一个比较特殊的数字:-0

    它可以用原码1000 0000来表示,

    咱们把1000 0000转为补码看看,

    1000 0000取反为1111 1111,

    再加1可得1 0000 0000;

    由于溢出(超过了char的8位数)所以-0的补码就是0000 0000

    我们再来看看-128,

    -128的原码可以写成1 1000 0000,

    我们来对其运算补码,

    取反1 0111 1111再+1可以得到1 1000 0000

    由于溢出了(超过了char的8位数),我们去掉第九位那么-128的补码就是1000 0000

    -128的补码和-0的原码是相等的

    所以这里我们就可以直接把-128看作-0。

     

    这里可以明确的是:

    -0的原码和-128的补码在char的情况下是相等的

    所以我们说

    Char的范围是-128——127

    实际上char的范围是-127——-0和0——127之间,但是-128的补码和-0的原码在char的情况下由于溢出就可以看成-0=-128

    圆圈理论的引入

    我们可以将char的取值范围可以看成是一个圆形,如下图:

    当127+1的时候,就等于-128了,我们看代码:

    这里你可能会有一个疑问:如果这样写呢?

    原因很简单,因为这个地方%d是整形,最大可以表示的数字是2的31次方-1;

    当a+2放到这里以后就会被自动看成unsigned形式,其运算将结果远远小于%d可以表达的最大数字,所以可以照常输出。

    那么我们利用圆圈理论,怎样数出int的最大值呢

    代码如下:

     

     具体的思想我也用圆圈理论表示出来

     

  • 相关阅读:
    Code First 迁移更新数据库
    vs2013常用快捷键
    Uploadify v3.2.1 参数说明
    中文datepicker控件
    C#去掉HTML标记
    扩展HtmlHelper类实现Mvc4分页
    MVC4实现批量更新数据
    MVC4.0实现批量删除
    通知的多线程问题 iOS
    写一个 setter 方法用于完成 @property (nonatomic, retain) NSString *name,
  • 原文地址:https://www.cnblogs.com/oldfish123/p/12498112.html
Copyright © 2011-2022 走看看