2017-09-23 142 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

相關問題