为什么要为此代码打印 -1,当位域设置为 1 时,我认为它是 1?
Why printing -1 for this code, I supposed it to be 1 when bit-field is set to 1?
#include<stdio.h>
int main()
{
struct byte
{
int one:1;
};
struct byte var = {1}; // statement A
printf("%d", var.one);
return 0;
}
在这里,我想我们已经将整数变量 'one' 的位内存限制为 1,即;它只能存储 0 和 1,在 'statement A' 处我们已经用 '1' 初始化了这个变量,这应该没问题,因为 'one' 仍然可以在它的内存中保留一点,但它正在打印 -1安慰 !有帮助吗?
实现定义的一个用int
类型定义的位字段是否等价于signed int
或unsigned int
。 (这仅适用于位字段;否则 int
与 signed int
完全相同。)
如果 int one:1;
是有符号的(就像在您的实现中一样),那么那个位就是符号位,唯一可能的值是 0
和 -1
.由于超出范围,您用于初始化它的值 1
隐式 转换 为 -1
。 (实际上转换的结果是实现定义的。)
将声明更改为:
unsigned int one:1;
它可以有值 0
和 1
。位字段通常应该显式未签名,除非您确实需要对它们进行签名——在这种情况下,您应该使用 signed int
而不是 int
.
#include<stdio.h>
int main()
{
struct byte
{
int one:1;
};
struct byte var = {1}; // statement A
printf("%d", var.one);
return 0;
}
在这里,我想我们已经将整数变量 'one' 的位内存限制为 1,即;它只能存储 0 和 1,在 'statement A' 处我们已经用 '1' 初始化了这个变量,这应该没问题,因为 'one' 仍然可以在它的内存中保留一点,但它正在打印 -1安慰 !有帮助吗?
实现定义的一个用int
类型定义的位字段是否等价于signed int
或unsigned int
。 (这仅适用于位字段;否则 int
与 signed int
完全相同。)
如果 int one:1;
是有符号的(就像在您的实现中一样),那么那个位就是符号位,唯一可能的值是 0
和 -1
.由于超出范围,您用于初始化它的值 1
隐式 转换 为 -1
。 (实际上转换的结果是实现定义的。)
将声明更改为:
unsigned int one:1;
它可以有值 0
和 1
。位字段通常应该显式未签名,除非您确实需要对它们进行签名——在这种情况下,您应该使用 signed int
而不是 int
.