标题:怪啊?位结构 联合体!!!!!!谁能给出满意回复
只看楼主
herotobe
Rank: 1
等 级:新手上路
威 望:1
帖 子:48
专家分:0
注 册:2006-5-3
 问题点数:0 回复次数:9 
怪啊?位结构 联合体!!!!!!谁能给出满意回复

main()
{ typedef struct {unsigned b:1;} BIT; /*位结构 */
union
{int t;
BIT bit[16];
} x;
int i;
x.t=0;
for(i=0;i<16;i++)
printf("%d",x.bit[i].b);

getch(); /* 请不要删除此行 */
}

这段程序怎么不能打印 t 的二进制编码?程序哪儿出问题了

[此贴子已经被作者于2006-5-7 17:16:35编辑过]

搜索更多相关主题的帖子: 联合体 二进制 结构 BIT 打印 
2006-05-07 14:19
论坛
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1372
专家分:0
注 册:2006-3-27
得分:0 

#include <stdio.h>
#include <conio.h>

int main(void)
{
int n, i, mask = 1 << 15;

printf("Enter n: ");
scanf("%d", &n);

for (i = 1; i <= 16; i++)
{
putchar( n & mask ? '1' : '0');
n <<= 1;

if (i % 8 == 0)
{
putchar(' ');
}
}

getch();
return 0;
}


日出东方,唯我不败! 做任何东西都是耐得住寂寞,任何一个行业要有十年以上的积累才能成为专家
2006-05-07 14:43
论坛
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1372
专家分:0
注 册:2006-3-27
得分:0 

你打印的全部是重复位吧

[此贴子已经被作者于2006-5-7 14:54:34编辑过]


日出东方,唯我不败! 做任何东西都是耐得住寂寞,任何一个行业要有十年以上的积累才能成为专家
2006-05-07 14:53
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
得分:0 
以下是引用herotobe在2006-5-7 14:19:00的发言:

main()
{ typedef struct {unsigned b:1;} BIT; /*位结构 */
union
{int t;  /*int应该改为unsigned,类型应该一致*/
BIT bit[16];
} x;
int i;
x.t=0;
for(i=0;i<16;i++)
printf("%d",x.bit[i].b);

getch(); /* 请不要删除此行 */
}

这段程序怎么不能打印 t 的二进制编码?程序哪儿出问题了


这个程序怪怪的,俺也搞不懂怎么就不能打印t的二进制编码?等高手来吧,俺正在修计算机组成原理……


对不礼貌的女生收钱......
2006-05-07 15:38
论坛
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:1372
专家分:0
注 册:2006-3-27
得分:0 
它打印的全部是低为,如果X.T是1就在前面打1个1和15个0

日出东方,唯我不败! 做任何东西都是耐得住寂寞,任何一个行业要有十年以上的积累才能成为专家
2006-05-07 15:40
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
得分:0 
以下是引用论坛在2006-5-7 15:40:00的发言:
它打印的全部是低为,如果X.T是1就在前面打1个1和15个0

低位,为什么是低位,int一般不就16位吗?
而且我按老兄您的说法,把x.t=1后,打印结果是1010000111011010啊?


对不礼貌的女生收钱......
2006-05-07 15:45
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
得分:0 
知道了,兄弟,我查了资料,位段不能取址,不能构成数组,而且不知道位段是从右到左还是从左到右的。
所以楼主您这个程序当然就是错的啦!
您就按2楼的提供的去做吧,其实您倒是不用怀疑知道它的存储结构的,书上这个倒没骗您哦~!

对不礼貌的女生收钱......
2006-05-07 15:52
herotobe
Rank: 1
等 级:新手上路
威 望:1
帖 子:48
专家分:0
注 册:2006-5-3
得分:0 

以下对位结构的讲解来自:MyTC v5.2(编译器)自带的c语言教程。
请注意红色部分
二、位结构
位结构是一种特殊的结构, 在需按位访问一个字节或字的多个位时, 位结构
比按位运算符更加方便。
位结构定义的一般形式为:
struct位结构名{
数据类型 变量名: 整型常数;
数据类型 变量名: 整型常数;
} 位结构变量;
其中: 数据类型必须是int(unsigned或signed)。 整型常数必须是非负的整
数, 范围是0~15, 表示二进制位的个数, 即表示有多少位。
变量名是选择项, 可以不命名, 这样规定是为了排列需要。
例如: 下面定义了一个位结构。
struct{
unsigned incon: 8; /*incon占用低字节的0~7共8位*/
unsigned txcolor: 4;/*txcolor占用高字节的0~3位共4位*/
unsigned bgcolor: 3;/*bgcolor占用高字节的4~6位共3位*/
unsigned blink: 1; /*blink占用高字节的第7位*/
}ch;
位结构成员的访问与结构成员的访问相同。
例如: 访问上例位结构中的bgcolor成员可写成:
ch.bgcolor

注意:
1. 位结构中的成员可以定义为unsigned, 也可定义为signed, 但当成员长
度为1时, 会被认为是unsigned类型。因为单个位不可能具有符号。
2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针,
如果是指针, 其成员访问方式同结构指针。
3. 位结构总长度(位数), 是各个位成员定义的位数之和, 可以超过两个字
节。
4. 位结构成员可以与其它结构成员一起使用。
例如:
struct info{
char name[8];
int age;
struct addr address;
float pay;
unsigned state: 1;
unsigned pay: 1;
}workers;'
上例的结构定义了关于一个工从的信息。其中有两个位结构成员, 每个位结
构成员只有一位, 因此只占一个字节但保存了两个信息, 该字节中第一位表示工
人的状态, 第二位表示工资是否已发放。由此可见使用位结构可以节省存贮空间


After all,tomorrow is another day!!!!
2006-05-07 16:31
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
得分:0 
以下是引用herotobe在2006-5-7 16:31:00的发言:

  2. 位结构中的成员不能使用数组和指针, 但位结构变量可以是数组和指针,
如果是指针, 其成员访问方式同结构指针。

那就只可能是你在定义结构体的时候出的问题,结构体一般成员都是2个以上,你只用了一个,而你上面说不能对位结构的成员使用数组和指针, 但位结构变量可以是数组和指针,这就矛盾了,因为你使用的时候,两者的地址就是同一个(当你结构体的成员只一个时),这样既满足对位结构中的成员不能使用数组和指针,又可以对结构变量使用数组和指针根本就是不可能的。
俺不太懂,乱说一通,如果错了,还请指教。

对不礼貌的女生收钱......
2006-05-07 16:52
soft_wind
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:1430
专家分:0
注 册:2006-4-5
得分:0 
俺得下了,麻烦高手给个好的解释。

对不礼貌的女生收钱......
2006-05-07 16:54



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-62342-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 1.186426 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved