4.低字节序+联合体形成的一个很有意思的问题

#include <stdio.h>
typedef union X {
    int x;
    char y[4];
}X;
 
int main() {
    X a;
    a.x = 0x11223344;
 
    printf("0x%x 0x%x 0x%x 0x%x\n", 
            a.y[0], a.y[1], a.y[2], a.y[3]);
 
    return 0;
}
一个很有意思的低字节序的问题,在一个联合体中,元素是共用同一个内存空间的。这段代码中x和y[4]的内存大小一样,所以在内存中的起始地址是相同的。
而x86机器的数据存储遵循低字节序原则,所以a.x在内存中的分布依次是0x11, 0x22, 0x33, 0x44,程序的输出为:0x44 0x33 0x22 0x11。

附:
数组的地址是连续的,在已知数组起始地址和大小的情况下,数组可以直接按(地址±n)直接访问当前地址的后第n个数或前n个数。

C语言中,联合体(union)是一种特殊的数据类型,允许在相同的内存位置存储不同的数据类型。可以利用联合体的这一特性将一个包含4个字节的字符数组转换为float类型。以下是使用联合体进行转换的基本步骤: 1. 定义一个联合体,该联合体包含一个4字节的字符数组和一个float类型的成员。 2. 通过字符数组成员,将要转换的字节序列赋值给联合体。 3. 通过float类型的成员读取联合体,得到转换后的float值。 下面是一个示例代码: ```c #include <stdio.h> #include <stdint.h> typedef union { uint8_t bytes[4]; float value; } ByteToFloatUnion; int main() { // 假设我们有一个4字节的数组,对应于一个float值的二进制表示 uint8_t byteArray[4] = {0x40, 0x49, 0x0F, 0xDB}; // 这是float值 100.625 的二进制表示 ByteToFloatUnion converter; // 将字节复制到联合体的字符数组成员中 for (int i = 0; i < 4; i++) { converter.bytes[i] = byteArray[i]; } // 通过联合体的float成员读取转换后的值 float result = converter.value; // 输出转换后的float值 printf("The float value is: %f\n", result); return 0; } ``` 请注意,这种转换方式依赖于特定的硬件架构和字节序(endianess)。字节序指的是多字节数据的存储顺序,有大端序(big-endian)和小端序(little-endian)之分。上面的例子没有考虑字节序问题,实际使用时需要确保字符数组的字节顺序与系统的字节序一致。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这里真有意思

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值