我正准备自己安排,这些天来解决C编程问题。 我的代码是:
#include<stdio.h>
int main()
{
struct value
{
int bit1:1;
int bit3:4;
int bit4:4;
}bit={1, 2, 13};
printf("%d, %d, %d\n", bit.bit1, bit.bit3, bit.bit4);
return 0;
}
我坚持这种结构。 我认为答案是:1,4,4 但输出为:-1,2,-3 请解释这个问题。 感谢。
答案 0 :(得分:3)
您正在观察的是符号扩展的隐式整数转换。从有符号的较小整数类型转换为较长的整数时,编译器将使用符号扩展转换。即前导位将填充较小类型的最高位。
您的位域bit1
只有一位。如果您将其设置为1
,则会设置最高有效位,并且符号扩展转换为int
将导致(int)0xFFFFFFFF == -1
。
同样为bit4
,它是4位并用13 == 0xD
初始化。这也设置了最高有效位。扩展到(int)0xFFFFFFFD == -3
。
如果您将位域声明为unsigned int
,那么您将获得零扩展整数转换并将观察输出
1, 2, 13
答案 1 :(得分:2)
在编译时它正在生成:
[Warning] overflow in implicit constant conversion [-Woverflow]
这就是你得到的原因
-1,2,-3
作为输出。
注意:始终使用调试器并调试程序。
答案 2 :(得分:2)
这将提供位域的值:
struct value
{
unsigned int bit1:1;
unsigned int bit3:4;
unsigned int bit4:4;
}bit={1, 2, 13};
printf("%d, %d, %d\n", bit.bit1, bit.bit3, bit.bit4);
为了获得位域的宽度,这是不可能的......
答案 3 :(得分:1)
:1,:4,:4让编译器感到困惑。这是结构的快速链接。
http://en.wikipedia.org/wiki/Struct_(C_programming_language)
更简洁的编程风格是单独定义结构并在另一行上实例化。
/*
simple1.c - a program to demonstrate c structures.
*/
// Standard libraries
#include <stdio.h>
int main()
{
// Definition
struct value
{
int bit1;
int bit3;
int bit4;
};
// Instantiation
struct value bit = {1, 2, 13};
// Usage
printf("%d, %d, %d\n", bit.bit1, bit.bit3, bit.bit4);
// All done
return 0;
}