zoukankan      html  css  js  c++  java
  • P54 扩展数字的位表示

    背景:不同字长的整数进行转换,需要在不改变数的大小的前提下将较小的数据类型转为更大的数据类型。

    无符号数的扩展:开头加0即可,也叫零扩展。

    有符号数(补码)的扩展:开头添符号位。

     1     short sx = -12345;
     2     unsigned short usx = sx;
     3     int x = sx;
     4     unsigned ux = usx;
     5 
     6     printf("sx = %d:	", sx);
     7     show_bytes((byte_pointer)&sx, sizeof(short));
     8     printf("usx = %u:	", usx);
     9     show_bytes((byte_pointer)&usx, sizeof(unsigned short));
    10     printf("x = %d :	 ", x);
    11     show_bytes((byte_pointer)&x, sizeof(int));
    12     printf("ux = %u:	", ux);
    13     show_bytes((byte_pointer)&ux, sizeof(unsigned));

    注:show_bytes的作用是转换十六进制

    运行结果

    sx=-12345:  cf c7

    usx=53191     cf c7

    x=-12345        ff ff cf c7

    ux=53191       00 00 cf c7

    12345(short)->11 0000 0011 1001(原码)->0011 0000 0011 1001(short,2byte=2*8bit=16位)->1011 0000 0011 1001(最高位添1,-12345的原码)

    ->1100 1111 1100 0111(-12345的补码)->cf c7(十六进制)

    12345(int)->11 0000 0011 1001(原码)->0000 0000 0000 0000 0011 0000 0011 1001(int,4byte=4*8bit=32位)->1000 0000 0000 0000 0011 0000 0011 1001(原码)

    ->1111 1111 1111 1111 1100 1111 1100 0111(补码)->ff ff cf c7(十六进制)

    对比无符号的扩充,cf c7->00 00 cf c7,即零扩展,不难看出,16位扩展至32位的过程中,

    补码由1100 1111 1100 0111变成了1111 1111 1111 1111 1100 1111 1100 0111,其变化在于前面补了若干个1,1即-12345的符号位。如果是正数(符号位为0),添0。

    因此,实际上扩展数字的位表示可以统一起来

    无符号数/正数  0扩展

    负数       1扩展

    先扩展位,再完成有符号到无符号的转化

    如,short->unsigned int

  • 相关阅读:
    拉普拉斯矩阵
    正定矩阵 和 半正定矩阵
    Random Walk
    论文解读(DGI)《DEEP GRAPH INFOMAX》
    python安装easyinstall/pip出错
    pip国内源设置
    在Jupyter Notebook添加代码自动补全功能
    [BUUCTF]PWN——bjdctf_2020_babystack2
    [BUUCTF]REVERSE——[BJDCTF 2nd]8086
    [BUUCTF]PWN——jarvisoj_tell_me_something
  • 原文地址:https://www.cnblogs.com/CofJus/p/12151954.html
Copyright © 2011-2022 走看看