user-0 提问: C语言,使用共用体和结构体 查看int型的bit分布

回复:
user: user-1
content: 有符号数，是所谓的补码数 最高位表示符号， 若最高位为0，表示正数，其绝对值为所有位包括符号位的原码对应二进制数 若最高位为1，表示负数，其绝对值为所有位包括符号位全部按位取反，再末尾加一后对应的二进制数

user: user-2
content: 位段的数据类型，只是表示该位段参与+-*/等算术运算时， 当作什么类型的整数使用， 以及最多占有多少 Bits，有无符号等等。 最终还是要按照实际占有 Bits多少，来表示和解释的。

user: user-2
content: 位段，按照所有位数计算，最高位是其所有位数中的最高位，而不是类型的最高位。 short  本身是 16Bits，但是你这里 因为是位段，只占1 bit .这个1bit 就是最高位了 由于 没有数据位，只有符号位，所以只能表示 0，-1 两个数   有符号数，是所谓的补码数，最高位 表示符号， 其它位： 正数 用原码， 负数用补码（反码加一）表示。  位段的位数，只要不等于， 类型位数本身， 那么 最高位就只是位段，所有位中的最高位，而不是类型的最高位。  位段的表示方法，和有符号数表示方法，在这点上略有不同，因为位段 和有符号数的位数往往不同。 往往要比有符号数本身的位数少。

user: user-2
content: 如果依然按照 16Bits short 来表示的话，那就永远没有符号位了 所以 ，有符号位段，实际上是按照位段的位数表示的有符号数， 不是C语言的内部数据类型的有符号数

user: user-3
content: 引用 12 楼 yikoumeishuidekujing 的回复:[quote=引用 11 楼 SXJIAKE 的回复:] [quote=引用 10 楼 yikoumeishuidekujing 的回复:] [quote=引用 8 楼 yikoumeishuidekujing 的回复:] [quote=引用 7 楼 SXJIAKE 的回复:] short 拿到的结果应该是 0xFFFF 所以实际上显示为 -1…… 像这种结构体位域最好用无符号的 你的回答是错误的,按你的说法,则 b0到b1都应该是-1,而不是只有b0到b7是1了[/quote]  写错了,应该是"则 b0到b31都应该是-1,而不是只有b0到b7是1了"[/quote]你赋值只给了个 255 ，才 1 个字节，8 位，怎么可能全都是 -1？[/quote]  所以说 一个short 只拿到一个 1,而不是 0xFFFF [/quote]算了，我说的你没看懂，不想解释了。

user: user-0
content: 引用 11 楼 SXJIAKE 的回复:[quote=引用 10 楼 yikoumeishuidekujing 的回复:] [quote=引用 8 楼 yikoumeishuidekujing 的回复:] [quote=引用 7 楼 SXJIAKE 的回复:] short 拿到的结果应该是 0xFFFF 所以实际上显示为 -1…… 像这种结构体位域最好用无符号的 你的回答是错误的,按你的说法,则 b0到b1都应该是-1,而不是只有b0到b7是1了[/quote]  写错了,应该是"则 b0到b31都应该是-1,而不是只有b0到b7是1了"[/quote]你赋值只给了个 255 ，才 1 个字节，8 位，怎么可能全都是 -1？[/quote]  所以说 一个short 只拿到一个 1,而不是 0xFFFF

user: user-3
content: 引用 10 楼 yikoumeishuidekujing 的回复:[quote=引用 8 楼 yikoumeishuidekujing 的回复:] [quote=引用 7 楼 SXJIAKE 的回复:] short 拿到的结果应该是 0xFFFF 所以实际上显示为 -1…… 像这种结构体位域最好用无符号的 你的回答是错误的,按你的说法,则 b0到b1都应该是-1,而不是只有b0到b7是1了[/quote]  写错了,应该是"则 b0到b31都应该是-1,而不是只有b0到b7是1了"[/quote]你赋值只给了个 255 ，才 1 个字节，8 位，怎么可能全都是 -1？

user: user-0
content: 引用 8 楼 yikoumeishuidekujing 的回复:[quote=引用 7 楼 SXJIAKE 的回复:] short 拿到的结果应该是 0xFFFF 所以实际上显示为 -1…… 像这种结构体位域最好用无符号的 你的回答是错误的,按你的说法,则 b0到b1都应该是-1,而不是只有b0到b7是1了[/quote]  写错了,应该是"则 b0到b31都应该是-1,而不是只有b0到b7是1了"

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:不是“除了符号位什么都没有了,勉为其难 解释为-1”； 而是“其符号位为1，表示负数。其绝对值为按各位（即所有位包括符号位）取反后再末位＋1，即1取反后为0，0＋1=1。”  懂了,十分感谢!!!

user: user-0
content: 引用 7 楼 SXJIAKE 的回复:short 拿到的结果应该是 0xFFFF 所以实际上显示为 -1…… 像这种结构体位域最好用无符号的 你的回答是错误的,按你的说法,则 b0到b1都应该是-1,而不是只有b0到b7是1了

user: user-3
content: short 拿到的结果应该是 0xFFFF 所以实际上显示为 -1…… 像这种结构体位域最好用无符号的

user: user-1
content: 不是“除了符号位什么都没有了,勉为其难 解释为-1”； 而是“其符号位为1，表示负数。其绝对值为按各位（即所有位包括符号位）取反后再末位＋1，即1取反后为0，0＋1=1。”

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:1 （补码）用来表示1位有符号数，其符号位为1，表示负数。其绝对值为按各位取反后再末位＋1，即1取反后为0，0＋1=1。 综上所述，1 （补码）用来表示1位有符号数，对应-1  按你的解释是合理的,  不过一个bit位也能表示负数,我需要再消化消化 当一个bit位是 无符号数时,能填入1或0,分别表示1和0 当一个bit位是 有符号数时,能填入1或0,接着系统根据第一个bit判断正负 遇到0时,判断其是正数,由于除了符号位什么都没有了,勉为其难 解释为0 遇到1时,判断其是负数,由于除了符号位什么都没有了,勉为其难 解释为-1  n个比特位可以表示有符号整数的范围是 -2^(n-1) ~ 2^(n-1)-1 这样就统一了 1个比特能表示的范围是 -1 ~ 0,即-1和0  OK! Thank you~~

user: user-4
content: 内存里都是一个 bit 的 1 只是这个 1 按有符号数来解释的话最高位是符号位，这里的最高位就是这个唯一的位了，它是 1 就表示是负数，至于负的多少就是按楼上的补码算法来确定的

user: user-1
content: 1 （补码）用来表示1位有符号数，其符号位为1，表示负数。其绝对值为按各位取反后再末位＋1，即1取反后为0，0＋1=1。 综上所述，1 （补码）用来表示1位有符号数，对应-1

user: user-0
content: 引用 1 楼 adlay 的回复:定义成 unsigned short 就是 1 了  的确是的,不过我想知道为什么 short情况下是-1呢 当定义成unsigned short时, 以bit0为例,其获得的值为1,所以是1 其补码形式是 0000000000000001  按理说 赋值给 short 也应该是1啊,为什么会是-1呢

user: user-4
content: 定义成 unsigned short 就是 1 了