程序员面试宝典little endian系统 变量存放问题

bb神猪 2015-01-30 11:45:17
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct bitstruct{
int b1:5;
int :2;
int b2:2;
}bitstruct;
int main()
{
bitstruct b;
memcpy(&b,"EMC EXAMINATION",sizeof(b));
printf("b.b1=%d,b.b2=%d\n",b.b1,b.b2);
return 0;
}
输出为什么是b.b1=5 b.b2=-2呢?详见程序员面试宝典164页12.2小结嵌入式编程。
...全文
240 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
luciferisnotsatan 2015-02-03
  • 打赏
  • 举报
回复
引用 5 楼 Yick__ 的回复:
[quote=引用 3 楼 luciferisnotsatan 的回复:] struct里总共有9个bit,所以2字节大。b1是0~4bit位,b2是7,8比特位 memcpy了EM,内存里就是 01000101(E)01001101 (M) 因为是小字节序,所以 15~0 bit位为 0100110101000101 红色b1补位后为5,绿色b2补位(有符号)后,就是-2
菜鸟请教一下问题,从宏观上看结构体内的空间字节是要对齐的,那么更细致一些,位是不是也要对齐一下呢?[/quote] 大小端只针对字节,不针对bit位。 而且只针对超过1字节的基本类型(如short,int,long),不针对非基本类型,比如char sz[20],char数组就不用考虑。int arr[20], 你只要考虑arr数组里的每个元素的大小端,但整个数组不用管。
赵4老师 2015-02-02
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
#pragma pack(push,1)
union U {
    unsigned char byte;
    struct BF {
        unsigned int b0:1;//a
        unsigned int b1:1;//b
        unsigned int b2:1;//c
    } bf;
} u;
#pragma pack(pop)
unsigned char bt;
int a,b,c;
int main() {
    for (bt=0;bt<8;bt++) {
        u.byte=(unsigned char)bt;
        a=u.bf.b0;
        b=u.bf.b1;
        c=u.bf.b2;
        printf("byte 0x%02x -- c:%d b:%d a:%d\n",bt,c,b,a);
    }
    for (c=0;c<2;c++)
    for (b=0;b<2;b++)
    for (a=0;a<2;a++) {
        u.bf.b0=a;
        u.bf.b1=b;
        u.bf.b2=c;
        bt=u.byte;
        printf("c:%d b:%d a:%d -- byte 0x%02x\n",c,b,a,bt);
    }
    return 0;
}
//byte 0x00 -- c:0 b:0 a:0
//byte 0x01 -- c:0 b:0 a:1
//byte 0x02 -- c:0 b:1 a:0
//byte 0x03 -- c:0 b:1 a:1
//byte 0x04 -- c:1 b:0 a:0
//byte 0x05 -- c:1 b:0 a:1
//byte 0x06 -- c:1 b:1 a:0
//byte 0x07 -- c:1 b:1 a:1
//c:0 b:0 a:0 -- byte 0x00
//c:0 b:0 a:1 -- byte 0x01
//c:0 b:1 a:0 -- byte 0x02
//c:0 b:1 a:1 -- byte 0x03
//c:1 b:0 a:0 -- byte 0x04
//c:1 b:0 a:1 -- byte 0x05
//c:1 b:1 a:0 -- byte 0x06
//c:1 b:1 a:1 -- byte 0x07

Yick__ 2015-02-02
  • 打赏
  • 举报
回复
引用 3 楼 luciferisnotsatan 的回复:
struct里总共有9个bit,所以2字节大。b1是0~4bit位,b2是7,8比特位 memcpy了EM,内存里就是 01000101(E)01001101 (M) 因为是小字节序,所以 15~0 bit位为 0100110101000101 红色b1补位后为5,绿色b2补位(有符号)后,就是-2
菜鸟请教一下问题,从宏观上看结构体内的空间字节是要对齐的,那么更细致一些,位是不是也要对齐一下呢?
luciferisnotsatan 2015-02-02
  • 打赏
  • 举报
回复
struct里总共有9个bit,所以2字节大。b1是0~4bit位,b2是7,8比特位 memcpy了EM,内存里就是 01000101(E)01001101 (M) 因为是小字节序,所以 15~0 bit位为 0100110101000101 红色b1补位后为5,绿色b2补位(有符号)后,就是-2
Yick__ 2015-02-01
  • 打赏
  • 举报
回复
这是个细致活,我以前也有想到过,但从来没有遇到过。
百曉生 2015-02-01
  • 打赏
  • 举报
回复
为什么会有这样的输出? 想问一下楼主了解位域的知识吗? 了解memcpy函数的用法吗?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧