2013-04-21 60 views
0

我想知道如何獲得C到不能延長我的二進制數,當我位位移到左邊左位移位在C沒有擴展

int main() 
{ 
    unsigned int binary_temp = 0b0100; 
    binary_temp = binary_temp << 2; 
    printf("%d", binary_temp); 
    return 0; 
} 

當我跑,我想的返回值爲0,因爲它有延長了我擁有的4位數字,但是現在它返回16(10000)。我如何讓C不延長我的電話號碼?

編輯:我想能夠使用二進制形式的數字,所以我需要只有4位數字,而不是隻輸出正確的數字。

+7

請注意,二進制'0b0100'表示法是非標準(GNU)擴展。 – 2013-04-21 03:54:53

+0

你是什麼意思「使用二進制形式的數字」? – GWW 2013-04-21 03:57:36

+0

@JonathanLeffler,你推薦什麼標準來表示二進制文字? – 2013-04-21 04:03:17

回答

9

它不延伸你的電話號碼,但將其保存爲unsigned int類型,是大小爲4個字節(32位)。您只填寫最後4位。要將其僅視爲4位,請使用按位與與掩碼值。下面是示例代碼:

int main() 
{ 
    unsigned int binary_temp = 0b0100; 
    binary_temp = (binary_temp << 2) & 0b1111; 
    printf("%u", binary_temp); 
    return 0; 
} 
+0

謝謝,按預期工作 – user2303605 2013-04-21 04:33:18

4

可以按位AND的結果與一個4比特掩碼值:

binary_temp = (binary_temp << 2) & 0xF; 
0

沒有0b標準C.你可以使用4

unsigned int /* prepare for wtf identifier: */ 
      binary_temp = 4; 

左移2乘以4.爲什麼不?

binary_temp *= 4; 

...然後減少模16?

binary_temp %= 16; 

什麼意義上有沒有使用二進制運算符,在這種情況下?我看不到。

%d指令對應於int參數,但您給出的參數printfunsigned int。這是未定義的行爲。

printf("%u", binary_temp); 

我相信哪一本書你正在讀會告訴你關於%u指令。

+0

這個表示法可能是非標準的,但GCC和Clang中都有'0bXXXX'表示法,並且與手邊的問題無關。 – 2013-04-21 05:31:22

+0

@ RichardJ.RossIII說到相關性:該問題多次提到C,但不是gcc或clang。 C由標準定義,而不是gcc或clang。在這個問題中沒有提到這些實現中的任何一個。我認爲指出違反約束是完全相關的,在這裏... – Sebivor 2013-04-21 05:42:00

+0

在這裏玩標準遊戲幾乎沒有建設性,你不覺得嗎? – 2013-04-21 05:59:40