zoukankan      html  css  js  c++  java
  • 17.3.10--->关于数值溢出问题

    取值范围:

    short、int、long 占用的字节数不同,所能表示的数值范围也不同。以32位平台为例,下面是它们的取值范围:


    数据类型                             所占字节数          取值范围
    short                                       2               -32768~32767,即 -215~(215-1)
    unsigned short                         2                0~65535,即 0~(216-1)
    int                                           4                 -2147483648~2147483647,即 -231~(231-1)
    unsigned int                             4                 0~4294967295,即0~(232-1)
    long                                         4                 -2147483648~2147483647,即 -231~(231-1)
    unsigned long                           4                    0~4294967295,即0~(232-1)

    当数值过大或过小时,有限的几个字节就不能表示,就会发生溢出。发生溢出时,最高位会被截去

    #include <stdio.h>
    int main()
    {
        unsigned int a = 0x100000000;
        int b = 0xffffffff;
        printf("a=%u, b=%d
    ", a, b);
        return 0;
    }

    运行结果:
    a=0, b=-1

    变量 a 为 int 类型,占用4个字节(32位),能表示的最大值为 0xFFFFFFFF,而 0x100000000 = 0xFFFFFFFF + 1,占用33位,已超出 a 所能表示的最大值,会发生溢出,最高位被截去,剩下的32位都是0。也就是说,在 a 被输出前,其值已经变成了 0。

    对于变量 b,每一位的值都是 1,包括符号位,以 %d 输出时,按照推理应该是 -0x7fffffff = -2147483647,但是输出结果却是 -1,这是为什么呢?

    明天写解答

    其实你的那个十六进制在赋值时,只要是负数,计算机就直接存入到存储器中,不会在转化了,所以就出现那个  0x80000003,不是-3,而是经过原码转化的补码,这个以后要注意

  • 相关阅读:
    eventbus 备注
    Retrofit 备注
    RxJava 备注
    dagger2 备注
    JVM 备注
    UI控件(UIPickerView)
    Android 知识杂记(MVP模式)
    UI控件(UIToolbar)
    UI控件(UIAlertController)
    UI控件(UIScrollView)
  • 原文地址:https://www.cnblogs.com/xiaoyoucai/p/6532874.html
Copyright © 2011-2022 走看看