问题标签 [bit-fields]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1829 浏览

c++ - GCC、-O2 和位域 - 这是错误还是功能?

今天,我在尝试位域时发现了令人震惊的行为。为了讨论和简单起见,这里有一个示例程序:

该程序故意导致 3 位位域溢出。这是使用“g++ -O0”编译时的(正确)输出:

3 位字段转换为 int:7

3 位字段转换为 int:0

这是使用“g++ -O2”(和 -O3)编译时的输出:

3 位字段转换为 int:7

3 位字段转换为 int:8

检查后一个示例的程序集,我发现:

优化刚刚插入“8”,假设 7+1=8,而实际上数字溢出并且为零。

幸运的是,据我所知,我关心的代码并没有溢出,但这种情况让我害怕——这是一个已知的错误、一个特性,还是这是预期的行为?我什么时候可以期望 gcc 在这方面是正确的?

编辑(重新:签名/未签名):

它被视为无符号,因为它被声明为无符号。将其声明为 int,您将获得输出(使用 O0):

3 位字段转换为 int:-1

3 位字段转换为 int:0

在这种情况下,-O2 会发生更有趣的事情:

3 位字段转换为 int:7

3 位字段转换为 int:8

我承认使用属性是一件可疑的事情;在这种情况下,这是我担心的优化设置的差异。

0 投票
4 回答
16679 浏览

c++ - 结构或联合中的“无符号临时:3”是什么意思?

可能重复:
这个 C++ 代码是什么意思?

我正在尝试使用 JNA 将 C 结构映射到 Java。我遇到了我从未见过的东西。

struct定义如下:

您可以看到一些变量被定义为unsigned op_attached:1,我不确定这意味着什么。这会影响为这个特定变量分配的字节数吗?

0 投票
5 回答
4952 浏览

sql-server - Microsoft 可以在一个位中存储三值字段吗?

我对 SQL/数据库一无所知,但我正在和一位从事大量数据库工作的朋友聊天,了解一些数据库如何使用“布尔”字段,除了 true 和 false 之外,该字段还可以取 NULL 值。

关于这一点,他发表了这样的评论:“值得微软称赞的是,他们从未将这种字段称为布尔值,他们只是将其称为位。这是一个真正的位 - 如果您有八个或更少的位字段在一条记录中,它只需要一个字节来存储它们。”

当然,这对我来说似乎是不可能的——如果该字段可以保存三个值,那么您将不会将其中的八个值放入一个字节中。我的朋友同意这看起来很奇怪,但恳求对底层内部的无知,并说据他所知,从 SQL 端看,这样的字段可以保存三个值,并且确实需要一个字节的存储空间. 我想我们中的一个人有一根电线交叉。谁能解释这里到底发生了什么?

0 投票
4 回答
12475 浏览

c - c 联合和位域

位域可以联合使用吗?

0 投票
3 回答
9311 浏览

c++ - 在 C/C++ 中读/写半字节(无位域)

有没有一种简单的方法可以在不使用位域的情况下读取/写入字节中的半字节?我总是需要读取两个半字节,但需要单独编写每个半字节。

谢谢!

0 投票
2 回答
174 浏览

c - 16 位位域导致 *read from uninitialized memory* 警告

我有这个类型定义:

并得到这个编译器警告:

现在,当我使用短而不是位域时,警告消失了:

我不确定如何看待这个警告 - 我不明白。不涉及未初始化的内存,也没有读取操作。恕我直言,编译器(VisualDSP++ 5.0 C/C++ Compiler)在这里是错误的。当我对Timestamp:32使用位域时,警告也会消失。

有什么我没有意识到的吗?我可以放心地忽略此警告吗?

0 投票
5 回答
490 浏览

c++ - 需要元编程魔法以无错误的方式定义位域的母脉

目标是控制允许哪些类型的用户在 UI 级别执行哪些操作。这段代码已经存在了一段时间;我只是想稍微改进一下。我正在尝试改进的文件可能应该是自动生成的,但这将是一个太大的变化,所以我寻求一个更简单的解决方案。

我们将调用的文件PermissionBits.h有一堆:

即使在快捷方式的帮助下,1UI64 << <numBits>;仍然存在问题,因为编码人员会创建具有重复值的标志、打错字等。

理想情况下,我想要一个可以很好地格式化并且看起来像这样的宏:

我希望这个宏灵活,并防止我输入少于 2 个或多于 65 个参数 - 命名空间名称 + 64 个标志。是否可以做我想做的事或接近它,还是应该求助于生成的代码?你还有什么建议?

0 投票
3 回答
19112 浏览

c - 在 C 中,声明中的冒号是什么意思?

可能重复:
'unsigned temp:3' 是什么意思

我正在学习一些内核代码,并遵循以下行(在 linux 2.4,sched.h,struct mm_struct 中):

这是什么意思?

0 投票
4 回答
22822 浏览

c - C 中是否存在与 sizeof() 等效的位?

Sizeof() 在应用于位域时不起作用:

...显然,因为它不能返回浮点部分大小或其他东西。然而,它提出了一个有趣的问题。在 C 语言中是否有等价物可以告诉您变量/类型中的位数?理想情况下,除了位域之外,它也适用于常规类型,例如charint 。

更新:

如果位域没有与 sizeof() 等效的语言,那么计算它的最有效方法是什么——在运行时!想象一下,您有依赖于此的循环,并且如果您更改位域的大小,您不希望它们中断 - 并且没有公平的作弊并使位域大小和循环长度成为宏。;-)

0 投票
3 回答
5987 浏览

javascript - 在 JavaScript 中使用整数作为位域

作为项目的一部分,我有一串介于 0 和 3 之间的数字,例如: 2030000000000000000030000000000000000003333212111221121301

我想通过 URL 传递这个字符串,所以我想我可以尝试使用一个位域,因为每个数字最多只使用 2 位。我在我的类中编写了以下函数来将这样的字符串与用作数据位域的整数数组相互转换:

他们似乎确实在工作,但……不完全是。当我在一开始传递我的示例中的字符串时:

我得到以下输出:

但是,当我将它传递给应该将其转换回来的函数时,它给了我这个:

请注意第二个字符串中的额外零。现在,我对位操作不熟悉,这是我的第一次尝试,但我四处搜索并阅读了我能找到的关于这个主题的文章,我试图在一张纸上写下随着循环的进展,比特的状态试图理解发生了什么,但我似乎无法弄清楚它为什么会出错以及那些额外的零在那里做了什么。要么我的string->bitfield功能关闭,要么关闭另一个,或者很可能两者兼而有之。但我真的想不通,所以有人对我如何解决任何问题有什么建议吗?

提前致谢!