struct的比特位的问题,printf后和预期的结果不一样

queshangxintou 2010-03-29 09:30:08


struct test
{
int a:2;
int b:3;
int c:1;
};

void main()
{
test data;
data.a = 2;//2bit
data.b = 5;//3bit
data.c = 1;//1bit
printf("%d,%d,%d\n", data.a, data.b, data.c);
}


输出结果为-2, -3 -1

若 data.a = 3;//2bit
data.b = 7;//3bit
data.c = 1;//1bit

则结果为 -1, -1, -1

请各位帮小弟看看,感觉很奇怪,编译环境为winXp + vc6
...全文
147 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
fairywell 2010-03-29
  • 打赏
  • 举报
回复
目前大部分 pc 机器里面都是用的 2's-complement 吧,无论正数、零还是负数,都是用的补码表示,而非只有负数。
另外ls兄弟的
补码,取反+1,~101 + 1= 010 + 1 = 011 = 3,即:-3
这个应该是
101,先减1,100,再保持符号位并取反其他吧,即 1~(00)=111,也即原码的 -3
queshangxintou 2010-03-29
  • 打赏
  • 举报
回复
不是修改,是搞清楚真正的原理
cattycat 2010-03-29
  • 打赏
  • 举报
回复

struct test
{
unsigned int a:2;
unsigned int b:3;
unsigned int c:1;
};


这样改下
queshangxintou 2010-03-29
  • 打赏
  • 举报
回复
补充一下,非常感谢以上各位的回复,特别是we_sky2008的回答,准确,到位
queshangxintou 2010-03-29
  • 打赏
  • 举报
回复
看来还是计算机原理没有学好啊,问题解决了
总结一下:
1、如果定义的是有符号数,位域的最高位被扩展为符号位
2、负数在计算机中的表示为补码,即除符号位各二进制位取反,然后再加1
3、n为整数的表示范围为-2^n ~ (2^n)-1
we_sky2008 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 queshangxintou 的回复:]
to we_sky2008:
data.a = 2;//2bit
输出结果是-2;
两位表示有符号数,应该取值范围-1到+1吧
[/Quote]
-2到1
假如某个有符号数有n个bit位,
则取值范围为:
负的2的n次方 到 正的2的n次方减一
superhard_d 2010-03-29
  • 打赏
  • 举报
回复
是不是应该符号位不变,其它位按位取反,末位加1?
101(5)=>111(-3)这个可以理解
可是10(2)呢?还进位变成110了吗?
queshangxintou 2010-03-29
  • 打赏
  • 举报
回复
to we_sky2008:
data.a = 2;//2bit
输出结果是-2;
两位表示有符号数,应该取值范围-1到+1吧
queshangxintou 2010-03-29
  • 打赏
  • 举报
回复
谢谢各位的解答,我知道了,补码的问题,忘了负数是用补码表示的
yuzl32 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 queshangxintou 的回复:]
to we_sky2008:
位域的最高位被扩展为符号位,这个我也知道,101怎么是-3呢
[/Quote]
补码,取反+1,~101 + 1= 010 + 1 = 011 = 3,即:-3
queshangxintou 2010-03-29
  • 打赏
  • 举报
回复
to we_sky2008:
位域的最高位被扩展为符号位,这个我也知道,101怎么是-3呢
fjx1982441 2010-03-29
  • 打赏
  • 举报
回复
楼上诸位均正解,符号扩展了。
yuzl32 2010-03-29
  • 打赏
  • 举报
回复
被符号扩展了,更改如下:

#include <stdio.h>

struct test
{
unsigned int a:2;
unsigned int b:3;
unsigned int c:1;
};

void main()
{
test data;
data.a = 2;//2bit
data.b = 5;//3bit
data.c = 1;//1bit
printf("%d,%d,%d\n", data.a, data.b, data.c);
}

happynxy 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 we_sky2008 的回复:]

int是有符号的
位域的最高bit被解释为符号位了
[/Quote]UP
we_sky2008 2010-03-29
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 we_sky2008 的回复:]
int是有符号的
位域的最高bit被解释为符号位了
[/Quote]
data.a = 2;//2bit 10 -> -2
data.b = 5;//3bit 101 -> -3
data.c = 1;//1bit 1 -> -1
we_sky2008 2010-03-29
  • 打赏
  • 举报
回复
int是有符号的
位域的最高bit被解释为符号位了

69,371

社区成员

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

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