2012-07-29 71 views
2
#include <stdio.h> 

int main(void) 
{ 
    int i = 258; 
    char ch = i; 
    printf("%d", ch) 
} 

輸出爲2!我們如何獲得以下輸出?

如何變量工作的範圍? c語言中不同數據類型的範圍是多少?

+0

C未定義。錯字? – wildplasser 2012-07-29 11:39:16

+1

@JanTuroň這不是一個溢出,歡迎來到C. – ouah 2012-07-29 11:39:58

回答

4

在分配爲更小的類型的值是

  • 截短,即258 % 256如果新類型是unsigned
  • 在一個實現定義的方式改性,如果新類型是有符號

否則,如果新類型是無符號的,所述值是通過 轉換反覆加上或減去比米多一個aximum值 可以在新的類型,直到該值是在 新型的範圍來表示。

否則,新的類型是有符號和值不能表示在它 ;結果是實現定義的或實現定義的信號被引發。

因此,所有花哨「加或減」是指它就像你說的是分配:

ch = i % 256; 
+0

類型在這裏簽名。 – ouah 2012-07-29 11:40:43

+1

@ouah你怎麼知道?據我所知,由於OP沒有指定,所以'ch'可以是有符號的或無符號的。 – cnicutar 2012-07-29 11:41:04

+0

好吧,對不對。但很可能是因爲'char'在大多數平臺上都有簽名。 – ouah 2012-07-29 11:42:02

3

char是8位長,而258需要九個位來表示。轉換爲char剔除258的最高有效位,即100000010二進制,導致10,即2二進制。

當你傳遞charprintf,它得到促進int,然後由%d格式說明回升,並打印2

1
#include <stdio.h> 

int main(void) 
{ 
    int i = 258; 
    char ch = i; 
    printf("%d", ch) 
} 

這裏i0000000100000010機器水平。 ch需要1個字節,所以它需要最後8位,它是00000010,它是2.

1

爲了找出C語言中各種類型的時間有多長,您應該參考limits.h(或C++中的爬升) 。字符不保證是8位長。它只是:

可以包含基本字符集的機器的最小可尋址單位。它是一個整數類型。實際類型可以是帶符號的也可以是無符號的,具體取決於實施方式

對其他類型的模糊定義也是相同的。

或者,您可以使用運算符sizeof以字節爲單位動態查找類型的大小。

您不可以假設原生C數據類型的確切範圍。標準的地方只有最小的限制,所以你可以說unsigned short可以容納至少65536個不同的值。上限可以不同

參見Wikipedia更多讀數

0

這是一個溢出;結果是不確定的,因爲char可能是signed(未定義行爲)或unsigned(定義明確的「環繞」行爲)。

1

炭上8位所以,當你施放(分配的整數爲char),在32位機中,I(int是在32位)var爲:

00000000 00000000 00000001 00000010 = 258 (in binary) 

當你想從這個中斷一個字符,您截斷後8位(一個字符是8位),讓您得到:

00000010這在十進制意味着2,這就是爲什麼你看到此輸出。

問候。

0

您正在使用little-endian機器。的258

二進制表示是

00000000 00000000 00000001 00000010 

而分配整數燒焦,只有8個字節的數據被複制到char。即LSB。

這裏只有00000010即0x02將被複制到字符。

相同的代碼會給零,如果是big-endian機器。