zoukankan      html  css  js  c++  java
  • 整数超出范围时如何表示?

    类型都是有表示范围的,整型也不例外

    在32位系统上int占四个字节内存,能表示的整数范围是-231--231-1 (最高位是符号位)

    unsigned int 也占四个字节内存,能表示的整数范围是0—232-1 (无符号位)

    如果某个整型变量超过了其类型所能表示的范围,编译器该如何解释这个变量呢?

    比如定义如下一个变量

    char ch = 128 ;

    由于char 是8bit 整型,所能表示的范围是 -128—127,超出了char所能表示的最大值

    实际上,ch被解释成了-128

    究其原因,这就要看变量的内存结构了,为了方便起见,假设某一个有符号整型长度为4bit,姑且称之为halfchar 吧,那么它能表示的范围是 -23—23-1, 即 -8 -- 7

    数据不多,将它们的二进制形式依依列出

    0000 – 0

    0001 – 1

    0010 – 2

    0011 – 3

    0100 – 4

    0101 – 5

    0110 – 6

    0111 – 7

    1000 – -8

    1001 – -7

    1010 – -6

    1011 – -5

    1100 – -4

    1101 – -3

    1110 – -2

    1111 – -1

    注:负数都是以补码表示的,并且有如下规则

    一个负数的补码 = 对应正数的补码按位取反, 然后末位加1

    所以 -7 的补码就是7 的补码0111 (正数的补码和原码相同) 按位取反1000, 然后末位加1

    即1001,那么如果我定义Halfchar hch = 8 ;(超出最大值7)

    先不管hch是什么类型,单看8的内存结构, 应该是01000,所以对应到上面的表,正好是-8 (高位的0已经被截断)

    再比如Halfchar hch = -9 ; (超出最小值-8),-9的补码表示为 10111,对应到上面的表,正好是7(高位的1被截断)

    由此我们得出一个小规律,一个数如果比它的类型最大值大1,那么它就变成了它的最小值,反之如果比它的最小值小1,那么就变成了它的最大值。以上讨论的是有符号数,这个规律同样适用于无符号数,比如

    unsiged char ch = 256 ;实际上ch 被解释成了最小值0

    Unsigned char ch = -1 (不合逻辑,为了验证而已) ch 实际上被解释成了 最大值255

    也就是说,当一个类型的值超出其表示范围是,直接将其对应的内存结构截断成其类型能表示的范围即可。再比如

    halfchar ch = 100 ; 100 的二进制表示为 0110 0100

    而 halfchar 只占4bit,所以将高位的4bit截断,只保留低位4bit,即0100

    所以ch = 100 实际上被解释成了 4

    总的规律就是,当某一个类型的值超出范围时,首先考虑该值的内存结构,内存结构搞明白了,其它的就都好办了。

    附:类型转换

    1 低精度->高精度,内存结构不变

    2 高精度->低精度,内存结构截断为低精度的范围

    低精度->高精度

    char ch = 65 ;

    cout << (int)ch << endl ;

    输出是65,如果直接输出,结果是A

    高精度->低精度

    int a = 22348016 ;

    cout << (short)a << endl ;

    结果是 240

    分析:

    22348016 的二进制表示为 00000000 10101010 00000000 11110000

    而short 是16bit整型,去掉高16位剩下 00000000 11110000 即十进制 240

  • 相关阅读:
    js打印的两种方法
    C# VS2010中,用微软自带的System.Data.OracleClient来连接Oracle数据库
    js获取本月第几周和本年第几周
    [转]优化数据库大幅度提高Oracle的性能
    sass的循环for,while,each
    sass的mixin,extend,placeholder,function
    float,absolute脱离文档流的总结
    React ref的用法
    cloneNode与事件拷贝
    mobx动态添加observable
  • 原文地址:https://www.cnblogs.com/graphics/p/1916327.html
Copyright © 2011-2022 走看看