IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C语言开发之UNION -> 正文阅读

[C++知识库]C语言开发之UNION

union简介

union常见于C语言嵌入式开发中,union中的数据分享同一段内存,大小与最大的数据类型一致。

union应用

查看浮点数的16进制表示:

#include<stdio.h>
#include <stdint.h>

uint32_t float2int(float a){
    union{
        float a;
        uint32_t b;
    }u;
    u.a = a;
    return u.b;
}

int main(){
    float num = 1.5;
    printf("%x\n", num);
    printf("%x\n",float2int(num));
    return 0;
}

输出:

//这里的输出是乱的,运行不同次输出结果不一样
d6009ab8
//这里的输出是符合IEEE754标准的
3fc00000

3fc00000
转换为二进制
0011 1111 1100 0000 0000 0000 0000 0000
0,01111111,100 0000 0000 0000 0000 0000
指数位 -127为0
尾数位个位补1变为1.1,转为10进制1.5。
最终结果1.5*2^0 = 1.5

为啥是乱的?个人解释如下,如有专业人员还望指正:
查看汇编代码

gcc union.c -S
ls
cat union.s
main:
        stp     x29, x30, [sp, -32]!
        add     x29, sp, 0
        fmov    s0, 1.5e+0
        str     s0, [x29, 28]
        ldr     s0, [x29, 28]
        fcvt    d0, s0
        adrp    x0, .LC0
        add     x0, x0, :lo12:.LC0
        bl      printf
        ldr     s0, [x29, 28]
        bl      float2int
        mov     w1, w0
        adrp    x0, .LC0
        add     x0, x0, :lo12:.LC0
        bl      printf
        mov     w0, 0
        ldp     x29, x30, [sp], 32
        ret

先看下面一段,将数据读入s0,(str后ldr,转入外存再转入内存,可能与内外存数据一致有关)然后利用fcvt指令转换位double型存入d0。

  fmov    s0, 1.5e+0
        str     s0, [x29, 28]
        ldr     s0, [x29, 28]
        fcvt    d0, s0
        adrp    x0, .LC0

而我们的printf,输出类型位"%x",为整数,所以printf函数找不到d0寄存器(存储浮点数的寄存器),找错寄存器位置导致的。
2.大小端转换

#include<stdio.h>
#include <stdint.h>

uint32_t big2low(uint32_t num){
    union{
        uint32_t num;
        uint8_t base[4];
    }u;
    u.num = num;
    uint32_t res = 0x00000000;
    for(int i = 0; i < 3; i++){
        res = (res | u.base[i]) << 8;
    }
    res = (res | u.base[3]);
    return res;
}

int main(){
    uint32_t num = 0x12345678;
    printf("%x\n", num);
    printf("%x\n",big2low(num));
    return 0;
}

编译运行

12345678
78563412
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-12 17:14:26  更:2022-03-12 17:15:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 5:01:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码