2013-11-22 35 views
0

我正在準備自己的位置和這些天解決C編程問題。 我的代碼是:找到一個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 請解釋這個問題。 謝謝。

+2

這裏沒有工會......你爲什麼期待1,4,4? – Chowlett

+0

抱歉@Chowlett,我做了編輯。 –

+1

'union'在定義上與'struct'非常相似,但是它們在實現上有很大不同! –

回答

2

在編譯時它產生:

[Warning] overflow in implicit constant conversion [-Woverflow] 

,這就是爲什麼你得到

-1,2,-3 

作爲輸出。
注意:始終使用調試器並調試您的程序。

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

你所觀察是符號擴展隱含整數轉換。從有符號較小的整數類型轉換爲較長的類型時,編譯器將使用符號擴展轉換。即前面的位將填充較小類型的最重要位。

您的位域bit1只有一個位。如果將其設置爲1,則設置最高有效位,並將符號擴展轉換爲int將導致(int)0xFFFFFFFF == -1

bit4相同,它是4位,並且初始化爲13 == 0xD這也是最重要的位設置。擴展到(int)0xFFFFFFFD == -3

如果你宣佈你的位域作爲unsigned int那麼你會得到零擴展整數轉換並觀察輸出

1, 2, 13 
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; 
}