返回信息流struct A
{
unsigned int a:2;
unsigned int b:1;
unsigned int c:3;
};
int main()
{
A B;
B.a=2;
B.b=1;
B.c=3;
printf("%d,%d,%d\n",B.a,B.b,B.c);
system("pause");
}
打印出来的是2,1,3没有问题。
要是定义的时候
struct A
{
int a:2;
int b:1;
int c:3;
};
的话就会出来,-2,-1,3
请教其中的玄机~
谢谢~
这是一条镜像帖。来源:北邮人论坛 / cpp / #7733同步于 2008/5/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[求助]关于位字段的问题
liux5520
2008/5/29镜像同步10 回复
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
同请教 应该是signed 和unsigned 的区别吧...
【 在 liux5520 (小喆) 的大作中提到: 】
: struct A
: {
: unsigned int a:2;
: ...................
【 在 purevirtual 的大作中提到: 】
: 同请教 应该是signed 和unsigned 的区别吧...
恩,二进制表示一样,只是最高位变成符号位,比如无符号的2的二进制表示是10,当最高位变成符号位的时候,也就是1变成符号位,出来的就是-2啊
喔,我想起来了,有道理有道理,是最高位的那个符号数的事...
【 在 UnitTest (TDD) 的大作中提到: 】
: 恩,二进制表示一样,只是最高位变成符号位,比如无符号的2的二进制表示是10,当最高位变成符号位的时候,也就是1变成符号位,出来的就是-2啊
【 在 purevirtual 的大作中提到: 】
: 喔,我想起来了,有道理有道理,是最高位的那个符号数的事...
无论位数是多少,有符号和无符号之间的转换规则都是一样的,当然转换的过程中二进制的表示是不变的
【 在 purevirtual 的大作中提到: 】
: 喔,我想起来了,有道理有道理,是最高位的那个符号数的事...
恩,我觉得这里面应该还有一个截断的过程,因为默认的写个字面量2应该是int型的,然后赋给长度只有2的位字段,大家可以去验证一下哈
本人愚钝,还是不明白哦,那3如何解释呢?
【 在 UnitTest 的大作中提到: 】
: 恩,二进制表示一样,只是最高位变成符号位,比如无符号的2的二进制表示是10,当最高位变成符号位的时候,也就是1变成符号位,出来的就是-2啊
【 在 vvbb 的大作中提到: 】
: 本人愚钝,还是不明白哦,那3如何解释呢?
恩,3的二进制表示应该是000000000000000000000000011,大家帮我数一下0写够了没有,大概32位吧,然后赋值给一个长度为3的字段,自然把前面的29位都去掉,也就是截断,只剩下最后三位即011,所以不管是有符号还是无符号都是3啊
【 在 UnitTest 的大作中提到: 】
: 恩,二进制表示一样,只是最高位变成符号位,比如无符号的2的二进制表示是10,当最高位变成符号位的时候,也就是1变成符号位,出来的就是-2啊
对于2的道理也是一样的,由32位截断为2位,最后只剩下二进制10,我前面说的有点不恰当
赞!
【 在 UnitTest 的大作中提到: 】
: 恩,3的二进制表示应该是000000000000000000000000011,大家帮我数一下0写够了没有,大概32位吧,然后赋值给一个长度为3的字段,自然把前面的29位都去掉,也就是截断,只剩下最后三位即011,所以不管是有符号还是无符号都是3啊