首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >结构中的C编程位字段

结构中的C编程位字段
EN

Stack Overflow用户
提问于 2013-05-17 19:13:02
回答 2查看 3.9K关注 1票数 2

为什么是答案呢?

代码语言:javascript
运行
复制
-1, 2, -3 ?  (especially -3 ??? how come)

struct b1 {
    int a:1;
    int b:3;
    int c:4;
} ;
int  main()
{
    struct b1 c = {1,2,13};
    printf("%d, %d, %d",c.a,c.b,c.c);
    return 0;
}

在VC++ 32位编辑器上编译。非常感谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-17 19:17:56

有符号整数用二进制补码表示。1位二进制补码数的范围是-1到0。因为二进制补码数的第一位表示它是负的,这就是你在那里所做的。

查看此处:sign extend 1-bit 2's complement number?

对于第三个数字也是如此,您已经溢出了-8到7的范围,这是一个4位有符号整数的范围。

你想做的就是让所有这些int -> unsigned int

在这里查看二进制补码的解释:http://www.ele.uri.edu/courses/ele447/proj_pages/divid/twos.html

票数 4
EN

Stack Overflow用户

发布于 2013-05-17 19:17:23

由于ac是设置了符号位的有符号整数,因此它们是负数:

代码语言:javascript
运行
复制
a:  1d =    1b (1 bit)
b:  2d =  010b (3 bits)
c: 13d = 1101b (4 bits)

有符号整数值存储在二进制补码中,最高位代表符号(1表示“负”)。因此,当您将位字段值读取为有符号整型时,您会得到ac的负值(扩展符号并从它们的2的补码表示中转换回来),但对于b,会得到一个正的2

要获得负2的补数的绝对值,可以减去1并反转结果:

代码语言:javascript
运行
复制
 1101b
-0001b
======
 1100b

倒置后的1100b变成了等于3d0011b。由于符号位为负(无论如何,在进行之前的计算之前都必须对其进行检查),因此结果为-3d

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16607592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档