#include <stdio.h>
int main(void)
{
int i = 258;
char ch = i;
printf("%d", ch)
}
輸出爲2!我們如何獲得以下輸出?
如何變量工作的範圍? c語言中不同數據類型的範圍是多少?
#include <stdio.h>
int main(void)
{
int i = 258;
char ch = i;
printf("%d", ch)
}
輸出爲2!我們如何獲得以下輸出?
如何變量工作的範圍? c語言中不同數據類型的範圍是多少?
在分配爲更小的類型的值是
258 % 256
如果新類型是unsigned否則,如果新類型是無符號的,所述值是通過 轉換反覆加上或減去比米多一個aximum值 可以在新的類型,直到該值是在 新型的範圍來表示。
否則,新的類型是有符號和值不能表示在它 ;結果是實現定義的或實現定義的信號被引發。
因此,所有花哨「加或減」是指它就像你說的是分配:
ch = i % 256;
char
是8位長,而258
需要九個位來表示。轉換爲char
剔除258
的最高有效位,即100000010
二進制,導致10
,即2
二進制。
當你傳遞char
到printf
,它得到促進到int
,然後由%d
格式說明回升,並打印2
。
#include <stdio.h>
int main(void)
{
int i = 258;
char ch = i;
printf("%d", ch)
}
這裏i
是0000000100000010
機器水平。 ch
需要1個字節,所以它需要最後8位,它是00000010
,它是2.
爲了找出C語言中各種類型的時間有多長,您應該參考limits.h(或C++中的爬升) 。字符不保證是8位長。它只是:
可以包含基本字符集的機器的最小可尋址單位。它是一個整數類型。實際類型可以是帶符號的也可以是無符號的,具體取決於實施方式
對其他類型的模糊定義也是相同的。
或者,您可以使用運算符sizeof
以字節爲單位動態查找類型的大小。
您不可以假設原生C數據類型的確切範圍。標準的地方只有最小的限制,所以你可以說unsigned short
可以容納至少65536個不同的值。上限可以不同
參見Wikipedia更多讀數
這是一個溢出;結果是不確定的,因爲char
可能是signed
(未定義行爲)或unsigned
(定義明確的「環繞」行爲)。
炭上8位所以,當你施放(分配的整數爲char),在32位機中,I(int是在32位)var爲:
00000000 00000000 00000001 00000010 = 258 (in binary)
當你想從這個中斷一個字符,您截斷後8位(一個字符是8位),讓您得到:
00000010這在十進制意味着2,這就是爲什麼你看到此輸出。
問候。
您正在使用little-endian機器。的258
二進制表示是
00000000 00000000 00000001 00000010
而分配整數燒焦,只有8個字節的數據被複制到char。即LSB。
這裏只有00000010
即0x02將被複制到字符。
相同的代碼會給零,如果是big-endian機器。
C未定義。錯字? – wildplasser 2012-07-29 11:39:16
@JanTuroň這不是一個溢出,歡迎來到C. – ouah 2012-07-29 11:39:58