• 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,而是经过原码转化的补码,这个以后要注意

  • 相关阅读:
    lintcode:落单的数
    lintcode: 翻转链表
    lintcode :Reverse Words in a String 翻转字符串
    lintcode :Invert Binary Tree 翻转二叉树
    lintcode : 空格替换
    lintcode:Matrix Zigzag Traversal 矩阵的之字型遍历
    lintcode: 爬楼梯
    lintcode:Compare Strings 比较字符串
    lintcode: 有效的括号序列
    lintcode :Valid Palindrome 有效回文串
  • 原文地址:https://www.cnblogs.com/xiaoyoucai/p/6532874.html
Copyright © 2020-2023  润新知