zoukankan      html  css  js  c++  java
  • 利用结构体观察浮点数

    利用结构体定义位域,可以观察浮点数内部是如何存储的,看代码:

    #include<cstdio>
    using namespace std;
    struct fp{
        unsigned fraction:23;
        unsigned exponent:8;
        unsigned sign:1;
    };
    int main(){
        float a=0.1;
        fp *p=(fp*)&a;
        printf("%d
    ",p->sign);
        printf("%d
    ",p->exponent-127);
        printf("%d
    ",p->fraction);
        return 0;
    }

    位域在本质上就是一种结构类型, 不过其成员是按二进位分配的。关于位域的几点说明:

    1、位域以二进制位来存储数据,可以在冒号左边是位域名,冒号右边是位域的长度。

    2、位域按定义顺序存储,记住是从存储变量的个位,也就是最右边开始的。

    3、一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。

    4、来确定结构体类型的成员变量的值所占的字位数,如果在实际应用中,该变量的值超出了在声明它时所声明的字位数,那么溢出的部分将会丢失。

    struct bs 
    { 
    unsigned a:4 
    unsigned :0 /*空域*/ 
    unsigned b:4 /*从下一单元开始存放*/ 
    unsigned c:4 
    }

    在这个位域定义中,a占第一字节的4位,后4位填0表示不使用,b从第二字节开始,占用4位,c占用4位。

    再看一个代码:

    #include<cstdio>
    using namespace std;
    struct test{
        unsigned char a:4;
        unsigned char b:4;
    };
    int main(){
     char c=12;
        test *pc=(test*)&c;
        printf("%x
    ",pc->a);
        printf("%x
    ",pc->b);
        return 0;
    }

     参考:https://blog.csdn.net/yusiguyuan/article/details/42212271

  • 相关阅读:
    SQL中JOIN 的用法
    ava中普通代码块,构造代码块,静态代码块区别及示例
    javabean的内省技术和BeanUtils的使用
    Tomcat服务器学习和使用(一)
    增强For循环
    JAVA单态设计模式
    关于枚举的整理
    java中遍历MAP的几种方法
    equals和==的区别
    深入剖析Java中的装箱和拆箱
  • 原文地址:https://www.cnblogs.com/litifeng/p/12306438.html
Copyright © 2011-2022 走看看