我在xcode中運行了下面的代碼,令我驚訝的是答案是256. 由於char只有8位長,所以我期望這是0. 在8位置中傾倒1。 有人可以解釋發生了什麼事嗎?256怎麼可以用char來表示?
int main()
{
unsigned char i = 0x80;
printf("%d\n", i<<1);
return 0;
}
我在xcode中運行了下面的代碼,令我驚訝的是答案是256. 由於char只有8位長,所以我期望這是0. 在8位置中傾倒1。 有人可以解釋發生了什麼事嗎?256怎麼可以用char來表示?
int main()
{
unsigned char i = 0x80;
printf("%d\n", i<<1);
return 0;
}
當你做i << 1
時,它被提升爲整數。例如,SHL
在x86中的32位字(即使您的c類型爲8位)上工作,因此移位的位不會從32位寄存器中丟棄。當您用"%d"
打印此區域時,您會得到256
。如果您想要與unsigned char
左移,則始終可以執行(i << x) & 0xff
。
或者轉換爲無符號字符,或者分配給一個無符號字符。 –
這實際上與「寄存器」或「SHR」無關。 C本身有一個非常直接的答案。 –
我剛纔說明了爲什麼需要促銷的原因!您還可以按照羅伯特提到的方式輸入cast! – jman
在這種情況下,正在發生的事情是,i<<1
中間結果是一個整數,其可以表示256
它是被提升到一個整數,它可以包含的256
就好的值。強制轉換爲unsigned char
會給你你所期望的結果:
printf("%d\n", (unsigned char)(i<<1));
整型提升 –
洛爾......對方的一分鐘內5個答案!這可能是一個記錄。 – spartygw
@spartygw然後你就不會很久了:-P –