整数的表示

整数表示

计算机中整数用补码表示:对于一个整数(x)的01序列(x_{n-1}x_{n-2}...x_3x_2x_1x_0),其(x)的值为(-2^{n-1}*x_{n-1}+sumlimits_{i=0}^{n-2}2^i*x_i)

例如x的二进制序列为1001011,(x = -2^6+2^3+2^1+2^0 = -53),也就是最高位是负的,其余都是正的。

位的拓展和截断

C语言中位拓展有两种方法,一种是零拓展,也就是拓展出的高位用0填充,另外一种是符号拓展,也就是拓展出的高位用符号位填充

C语言中将一个short类型的整数拓展为int或者unsigned int类型后其位模式是怎么样的?

做两个简单实验即可验证:

#include <stdio.h>
// 将一个整数的位模式打印出来
void show_bytes(unsigned char* p, unsigned len) {
    for(int i=len-1; i>=0; --i) {
        printf("%.2X",p[i]);
    }
    printf("
");
    return;
}



int main() {
    unsigned short a = 0x8000;
    printf("unsigned short向int拓展:
");
    int ia = a;
    show_bytes((unsigned char*)&ia, sizeof(ia));

    printf("unsigned short向unsigned int拓展:
");
    unsigned ua = a;
    show_bytes((unsigned char*)&ua, sizeof(ua));

    short b = 0x8000;
    int ib = b;
    unsigned ub = b;
    printf("short 向int拓展:
");
    show_bytes((unsigned char*)&ib, sizeof(ib));
    printf("short 向unsigned int拓展:
");
    show_bytes((unsigned char*)&ub, sizeof(ub));
    return 0;
}

//结果为
unsigned short 向 int 拓展:
00008000
unsigned short 向 unsigned int 拓展:
00008000
short 向 int 拓展:
FFFF8000
short 向 unsigned int拓展:
FFFF8000

实验结果说明用哪种方法拓展取决于需要拓展的数字是否是unsigned,如果是就用零拓展,否则就是符号拓展。

数的截断不用bb赖赖,直接把高位去掉。

原文地址:https://www.cnblogs.com/rookiezjz/p/13617487.html