C 位场概念

C 位场概念,c,bit-fields,C,Bit Fields,输出为: -2,-2,1 在C++编译器和C++编译器中,上述代码的输出是什么? 为什么呢?我的C编译器得到了-2-21。问题是您的位字段对于您试图存储的数字来说太小。在前两种情况下,最左边的位是1,因此它们被解释为负数。要解决此问题,请执行以下操作之一: 使您的位字段变大 将位字段声明为无符号整数而不是整数 打印前强制转换为无符号整数,并使用%u打印 您得到这些答案的原因与此程序相同: struct A { int a:2; int b:3; int c:3; }; int main(

输出为: -2,-2,1

在C++编译器和C++编译器中,上述代码的输出是什么?
为什么呢?

我的C编译器得到了-2-21。问题是您的位字段对于您试图存储的数字来说太小。在前两种情况下,最左边的位是1,因此它们被解释为负数。要解决此问题,请执行以下操作之一:

  • 使您的位字段变大
  • 将位字段声明为无符号整数而不是整数
  • 打印前强制转换为无符号整数,并使用%u打印
    您得到这些答案的原因与此程序相同:

    struct A
    {
     int a:2;
     int b:3;
     int c:3;
    };
    
    int main()
    {
     struct A p = {2,6,1};
     printf("\n%d\n%d\n%d\n",p.a,p.b,p.c);
     return 0;
    }    
    
    #包括
    #包括
    内部主(空)
    {
    int32_t a=4294967294;
    printf(“%d\n”,a);
    返回0;
    }
    
    具有输出
    -2
    。初始化一个数字太大而无法容纳的有符号变量会导致对其进行不同的解释。根据规范:

    否则,新类型已签名,且无法在其中表示值;要么结果是实现定义的,要么引发实现定义的信号


    您的系统似乎正在使用。持有
    2
    2位字段将是二进制的
    10
    ,在2的补码系统中是
    -2
    。同样地,
    110(6)
    对于2的补码中的
    3位
    表示是
    -2
    。而
    1
    是普通的
    1


    另外,请阅读有关有符号位字段的内容,现在让我们看看到底发生了什么。让我们从给定的代码开始:

    #include <stdio.h>
    #include <stdint.h>
    
    int main(void)
    {
        int32_t a = 4294967294;
        printf("%d\n", a);
        return 0;
    }
    
    3位内的值为101(5),因为3位集合的符号位为1,因此为负值。因此,我们需要找到2对101的赞美,也就是011(3)。 因此,通过应用上述逻辑,我们将输出为-3。类似地,其他人也可以证明

    e、 g.对于1001(9),我们将采用3位值,因为a:3。因此,它将是001(1)。由于此处未设置符号位,即1,因此无需使用2的补码。直截了当的答案是1。
    类似地,也可以进行其他操作。

    请看这里:是,答案与输出一致。位字段仅适用于无符号值(不确定有符号值的行为是否未定义或未指定)。为什么,这是
    有符号
    无符号
    整数之间的区别。您可能需要
    无符号
    @williampersell,位字段对于有符号的值定义得非常好。
    struct A
    {
     int a:3;
    };
    int main()
    {
     struct A p = {5};
     printf("%d",p.a);
    }