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

  • 相关阅读:
    【引用】关于closeonexec标志
    CentOS解决编码问题
    /etc/init.d/functions (转)
    centos 安装 中文 支持 语言包(转)
    vsftpd 530 错误
    __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程)(转)
    C语言中可变参数的用法 va_start va_end(转)
    守护进程 setsid(转)
    /dev/null 重定向 ./sh >/dev/null 2>&1
    C# 子类调用父类构造函数
  • 原文地址:https://www.cnblogs.com/CofJus/p/12151954.html
Copyright © 2011-2022 走看看