有关32位机整型和无符号整型取值的最大值最小值问题

时间:2021-03-30 14:45:53

遇到32位16进制整数需要求取带符号型输出无符号型输出两种情况下的值,可以用一下方法解决。
16进制数带符号型整数求值:先把16进制数用二进制数表示,看符号位是0还是1,是0的话就直接求值,是1就把最后一位作为符号位,在按其他的位求得这个二进制数的补码(因为负数在计算机中用补码存储,所以这里的二进制数是某一个数A的补码B,要求一个已知补码B的原码A,只需要对求取这个已知的补码B的补码C,就得到了已知补码的原码A, C就等于A),再求值。

16进制数无符号整型求值:直接求值。

所需知识点

1在计算机中整数的存储

1.1整数位正数时,以原码形式存储;为负数时以补码形式存储。

1.2正数的补码,原码,反码是一样的;

          负数的反码是将除符号位以外的其他位全部取反得到(例:原码1000 0001,其反码为1111 1110);

         负数的补码是将这个负数的反码加1 得到(例:原码1000 0001,其反码为1111 1110,其补码为1111 1111)。

1.3已知一个原码A的补码B,要求得这个原码A,只需要求得这个已知的补码B的补码C,这个补码的补码C就是已知的补码的原码A。

        (例:已知原码A的补码B为:1111 1111,B的反码为:1000 0000,B的补码为:1000 0001)。

1.4:32位的二进制数用16进制表示方法:将32位的二进制数的每相邻4位作为一个二进制数,计算出值,再用1位16进制数表示。

       (例:1111  1111   1111   1111   1111   1111   1111   1111就可以表示为 f f f f    f f f f,因为二进制数1111是15,16进制的15表示为 f )。

最小值:

0x8000 0000为带符号整型数的最小值。用二进制表示为1000  0000  0000  0000    0000  0000  0000  0000;
因为是带符号型所以最后面的1是符号位,而且这个二进制数只是原码A的补码B,因为符号位是1,表示负数,所以需要求得它B的补码C才能知道这个数的值是多大。它的反码为1111  1111   1111   1111     1111   1111   1111   1111,
它的补码C是反码加一,进一位,为:1   1000   0000   0000   0000   0000      0000   0000   0000   0000;
这个补码C就是原来二进制数的原码,
它的大小是2的31次方,即2147483648,所以这个数的值是-2147483648。是带符号整形的最小值。不带符号整型的最小值是0

若果0x8000 0000是一个无符号型整数,那么它表示为二进制数为:1000   0000   0000   0000      0000   0000   0000   0000。
没有符号位,直接得它的值为2的31次方,为2147483648。

最大值:

0xFFFF  FFFF为不带符号整型的最大值,用二进制表示为:1111   1111   1111   1111        1111   1111   1111   1111
它的大小是2的32次方减1,得到4294967296 - 1 = 4294967295是不带符号整型的最大值。带符号整型的最大值在后面详述。

若果0xFFFF  FFFF是一个带符号整型,那么它表示为二进制数为:1111   1111   1111   1111      1111   1111   1111   1111
最后一位数1是符号位,这个二进制数是负数,需要求得它的补码才能知道它的值,它是某一个数的原码A的补码B。
可以求得它的反码为1000   0000   0000   0000       0000   0000   0000   0000   ,
反码加1得到它的补码为:1000   0000   0000   0000      0000   0000   0000   0001。
求得它的值为-1

0x7FFF  FFFF是带符号整型的最大值,它用二进制数表示为:0111   1111   1111   1111     1111   1111   1111   1111。
它的最后一位是符号位0,所以是正数,它的原码,反码,补码都是一样的。
它的值为2的32次方减1,为:2147483647是带符号整型的最大值。
以下代码摘自http://c.biancheng.net/cpp/html/2896.html
#include <stdio.h>
#include <stdlib.h>
int main()
{
    int a=1234;
    unsigned a1=1234;
    int b=0x7fffffff;
    int c=0x80000000;  // 0x80000000 = 0x7fffffff + 0x1
    int d=0xffffffff;
    unsigned e=0xffffffff;
    printf("a=%d, a(u)=%u\n", a, a);
    printf("a1=%d, a1(u)=%u\n", a1, a1);
    printf("b=%d, b(u)=%u\n", b, b);
    printf("c=%d, c(u)=%u\n", c, c);
    printf("d=%d, d(u)=%u\n", d, d);
    printf("e=%d, e(u)=%u\n", e, e);

    system("pause");
    return 0;
}

总结:遇到32位16进制整数需要求取 带符号型输出 无符号型输出 两种情况下的值,可以用一下方法解决。
16进制数带符号型整数求值:先把16进制数用二进制数表示,看符号位是0还是1,是0的话就直接求值,是1就把最后一位作为符号位,在按其他的位求得这个二进制数的补码(因为负数在计算机中用补码存储,所以这里的二进制数是某一个数A的补码B,要求一个已知补码B的原码A,只需要对求取这个已知的补码B的补码C,就得到了已知补码的原码A, C就等于A),再求值。

16进制数无符号整型求值:直接求值。