2013-07-18 53 views
0

我在xcode中運行了下面的代碼,令我驚訝的是答案是256. 由於char只有8位長,所以我期望這是0. 在8位置中傾倒1。 有人可以解釋發生了什麼事嗎?256怎麼可以用char來表示?

int main() 
{ 
    unsigned char i = 0x80; 
    printf("%d\n", i<<1); 
    return 0; 
} 
+4

整型提升 –

+1

洛爾......對方的一分鐘內5個答案!這可能是一個記錄。 – spartygw

+2

@spartygw然後你就不會很久了:-P –

回答

1

當你做i << 1時,它被提升爲整數。例如,SHL在x86中的32位字(即使您的c類型爲8位)上工作,因此移位的位不會從32位寄存器中丟棄。當您用"%d"打印此區域時,您會得到256。如果您想要與unsigned char左移,則始終可以執行(i << x) & 0xff

+3

或者轉換爲無符號字符,或者分配給一個無符號字符。 –

+3

這實際上與「寄存器」或「SHR」無關。 C本身有一個非常直接的答案。 –

+0

我剛纔說明了爲什麼需要促銷的原因!您還可以按照羅伯特提到的方式輸入cast! – jman

0

在這種情況下,正在發生的事情是,i<<1中間結果是一個整數,其可以表示256

1

它是被提升到一個整數,它可以包含的256就好的值。強制轉換爲unsigned char會給你你所期望的結果:

printf("%d\n", (unsigned char)(i<<1));