遇到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进制数无符号整型求值:直接求值。