gpt4 book ai didi

c - 警告只有一个位域,而不是两个?

转载 作者:太空宇宙 更新时间:2023-11-04 03:22:48 25 4
gpt4 key购买 nike

灵感来自于此question ,我有:

#include<stdio.h>
struct st
{
int a:1;
int b:2;
};

int main()
{
struct st obj={1, 2};
printf("a = %d\nb = %d\n",obj.a,obj.b);
}

我得到:

Georgioss-MacBook-Pro:~ gsamaras$ gcc -Wall main.c 
main.c:10:26: warning: implicit truncation from 'int' to bitfield changes value
from 2 to -2 [-Wbitfield-constant-conversion]
struct st obj={1, 2};
^
1 warning generated.
Georgioss-MacBook-Pro:~ gsamaras$ ./a.out
a = -1
b = -2

我想我明白为什么两个位域都无法保存它们的值(根据这个 answer ),但我不明白为什么编译器只警告 2 而不是 1 也是!有什么想法吗?

我在我的 Mac 上使用:

Georgioss-MacBook-Pro:~ gsamaras$ gcc -v
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple LLVM version 8.1.0 (clang-802.0.38)
Target: x86_64-apple-darwin16.3.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

在旧的 Linux 系统中,gcc 版本 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5),我没有收到相关警告。

在 Debian 安装中,gcc 版本 4.9.2 (Debian 4.9.2-10),我没有收到相关警告!

最佳答案

https://en.wikipedia.org/wiki/Two%27s_complement

可能会发生一些事情,也许一些实验会有所帮助。

首先,可能是 gcc 足够聪明,知道单个位不能真正为正或负,因为它只是单个位。

另一种可能性是 gcc 计算表达式的顺序与您的想法相反。一些编译器从右到左评估,在您的情况下,排除错误并停止。

要进行测试,请更正 b 的位域以在不翻转符号位的情况下保存“2”的带符号整数(3 位应该有效)。如果在修复“b”时您为“a”生成了错误,那么您就知道这只是编译器评估顺序。

如果修复 'b' 不会导致 'a' 发出警告,则 gcc 正在对单个位字段执行一些内部优化。

此外,将您的位域类型更改为“uint”也应该修复警告,在这种情况下,它只是表示的符号位被翻转了。

快乐编码。

编辑相关源码:https://github.com/llvm-mirror/clang/blob/master/lib/Sema/SemaChecking.cpp#L8812

关于c - 警告只有一个位域,而不是两个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43890884/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com