找到c程序的输出

时间:2013-11-22 16:14:30

标签: c structure output

我正准备自己安排,这些天来解决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 请解释这个问题。 感谢。

4 个答案:

答案 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;
}