C语言位域问题

C语言 码拜 8年前 (2016-09-15) 1091次浏览
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct base64{
unsigned  d1:6;
unsigned  d2:6;
unsigned  d3:6;
unsigned  d4:6;
};
int main()
{
char buf[10]=”qwertyui”;
struct base64 *bs=(struct base64 *)buf;
printf(“d1=%u ,d2=%u, d3=%u, d4=%u\n”,bs->d1,bs->d2,bs->d3,bs->d4);
}
运行结果:
d1=49 ,d2=29, d3=23, d4=25
演示:
q=01110001
w=01110111
e=01100101
qwe_buf=011100010111011101100101

d1=011100  = 28
d2=010111  = 25
d3=011101  = 29
d4=100101  = 37
ewq_buf=011001010111011101110001
d4=011001  25
d3=010111  23
d2=011101  29
d1=110001  49
谁知道这是为什么呢

解决方案

5

一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域.

10

1. 一个位域必须存储在同一个字节中,不能跨两个字节。如一个字节所剩空间不够存放另一位域时,应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。
2. 由于位域不允许跨两个字节,因此位域的长度不能大于一个字节的长度,也就是说不能超过8位二进位。

30

你先把位域设成8Byte 的看看是什么结果
然后再设成6Bits的,这样就好理解了

union bs64{
struct base64{
        unsigned  d1:6;
        unsigned  d2:6;
        unsigned  d3:6;
        unsigned  d4:6;
        
} bs6;
struct base64{
        unsigned  c1:8;
        unsigned  c2:8;
        unsigned  c3:8;
        unsigned  c4:8;
     } bs8;
};
bs64 *p =“123456”;

这样看看


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C语言位域问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)