2011-09-25 87 views
2

我想sizeof(char)是一個字節。然後,當我寫下面的代碼,C按位移

#include<stdio.h> 

    int main(void) 
    { 
     char x = 10; 

     printf("%d", x<<5); 
    } 

輸出是320

我的問題是,如果char是一個字節長和值是10,它應該是:

0000 1010 

當我移動5,不應該變成:

0100 0001 

爲什麼輸出320而不是65?

我在Linux上使用gcc和檢查了sizeof(char) = 1

+0

將'void main()'更改爲'int main(void)',並且不要忘記所需的'#include '。噢,'sizeof(char)== 1',根據定義(一個字節) - 但一個字節可以超過8位(儘管在任何你可能遇到的系統上都會有8位)。 –

回答

12

在C,是比int較小的所有中間體自動提升爲int。 因此,您的char正被提升爲大於8位。

所以你0000 1010被移出了5位拿到320(沒有移動過頂)

如果要旋轉,你需要做兩班制和掩碼:

unsigned char x = 10; 

x = (x << 5) | (x >> 3); 
x &= 0xff; 

printf("%d", x); 

使用內聯彙編或編譯器支持內聯函數可以更快地完成它。

+0

x&= 0xff是否有用?字符並不是每一個大小都在變化,所以不應該做任何事情,對吧? – mikbanUtah

+0

你是對的。在這種情況下,它什麼都不做。當我寫這個答案時,我認爲我過於謹慎。 (可能要防止'char'可能超過8位的可能性。) – Mysticial

0

因爲你描述的是一個旋轉,而不是一個轉變。 0總是左移。

+0

那麼可以在C中旋轉嗎? – mihsathe

+0

沒有旋轉操作符,但可以拖放到程序集以便使用任何旋轉操作碼。 –

0

Mysticial是對的。如果你

char x = 10; 
printf("%c", x); 

它打印「@」,而如果你檢查你的ASCII表,是64

0000 1010 << 5 = 0001 0100 0000 

你有溢出,但由於它被提升到一個int,它只是打印號碼。