zoukankan      html  css  js  c++  java
  • 如何讀取float型態資料在記憶體中的值

     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 main()
     4 {
     5 float x;
     6 
     7 x=-1;
     8 int i;
     9 for (i=3;i>=0;i--)
    10 {
    11 printf("%x",((unsigned char*)&x)[i]);
    12 }
    13 
    14 }

     或者

    int i;
    union {
      float num;
      unsigned char n[4];
      } q;

    q.num=-1;
    for(i=3;i>=0;i--)
      printf("%x ", q.n[i]);


    可以得到一樣的結果
    IEEE 754:
    -1 = -1.0*2^+127 = 1,0111 1111,0000...23個
    所以結果: 1,011=B, 1111=F, 1000=8, 0000....=0,00,00 ==>BF800000

    ---

    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
    int main() 
    {
        float a = 12.5;
        printf("%d\n", a);
        printf("%d\n", (int)a);
        printf("%d\n", *(int *)&a);
        return 0; 
    }

    参考答案
    该项程序输出如下所示,
    0
    12
    1095237632
    原因是:浮点数是4个字节,12.5f 转成二进制是:01000001010010000000000000000000,十六进制是:0×41480000,十进制是:1095237632。所以,第二和第三个输出相信大家也知道是为什么了。而对于第一个,为什么会输出0,我们需要了解一下float和double的内存布局,如下:

    • float: 1位符号位(s)、8位指数(e),23位尾数(m,共32位)
    • double: 1位符号位(s)、11位指数(e),52位尾数(m,共64位)

    然后,我们还需要了解一下printf由于类型不匹配,所以,会把float直接转成double,注意,12.5的float和double的内存二进制完全不一样。别忘了在x86芯片下使用是的反字节序,高位字节和低位字位要反过来。所以:

    • float版:0×41480000 (在内存中是:00 00 48 41)
    • double版:0×4029000000000000 (在内存中是:00 00 00 00 00 00 29 40)

    而我们的%d要求是一个4字节的int,对于double的内存布局,我们可以看到前四个字节是00,所以输出自然是0了。

    这个示例向我们说明printf并不是类型安全的,这就是为什么C++要引如cout的原因了

  • 相关阅读:
    自己动手实现一个WEB服务器
    Java SPI机制和使用示例
    Redis笔记(七):Redis应用场景
    Linux笔记:linux常用命令
    Linux笔记:vi常用命令
    PostgreSQL执行超时的问题
    Redis笔记(五):Redis发布订阅
    Redis笔记(四):Redis事务支持
    Redis笔记(三):Redis常用命令
    Redis笔记(二):Redis数据类型
  • 原文地址:https://www.cnblogs.com/bittorrent/p/2820755.html
Copyright © 2011-2022 走看看