2017-09-23 65 views
3

在下面的代码中,我得到A = -1作为输出。我想,这是因为我正在溢出3位的A成员。 我在这方面有两个问题:为什么结构成员似乎有溢出价值?

  1. 不应该编译器考虑最后3位,并忽略其余成员A?为什么价值是负面的?
  2. 如果考虑所有位,为什么我会得到B = 0的值作为输出?

我以为A会有7的值,但我显然是误解了一些东西。请帮忙。

#include <stdio.h> 
typedef struct 
{ 
    char A: 3; 
    char B: 3; 
    char C: 3; 
}my_struct; 
my_struct new_object = {0}; 

void main(void) 
{ 
    new_object. A = 63; 
    printf("A = %d\n", new_object.A); 
    printf("B = %d\n", new_object.B); 
} 
+0

是不是将63分配给一个未定义的行为?所以结果可能是任何事情。 –

+1

@CostantinoGrana:不,它不是。它不是'char c = 0xffff;'不是。感谢C的隐式转换。 – alk

+0

@alk:感谢您提供的信息。我不知道位域是否包含在整数转换中。 –

回答

3

我期待A将被具有7

行的值。 7是111的二进制。但你有一个签署字符(显然,因为你告诉我们它出来-1)。所以你需要这样做:

typedef struct 
{ 
    unsigned char A: 3; 
    unsigned char B: 3; 
    unsigned char C: 3; 
}my_struct; 
+0

谢谢。将它作为unsigned赋给A值为7。但是,我现在感到困惑,为什么当unsigned不被写入时它给了我-1的值。我不应该得到-3的值,因为它是3位。最重要的位可以用于符号,其余的两位应该被设置?这不应该发生吗? 我正在使用链接上的编译器:https://www.tutorialspoint.com/compile_c_online.php – Doherty

+2

在补码二进制中,'111'是-4 + 2 + 1,它确实是-1。一切都如预期。 -3将是101. –

+0

哎呀!谢谢约翰。我完全忘记了负数存储在2的补码中。愚蠢的我。对不起 – Doherty

相关问题