2014-11-22 164 views
3
int num = 65537; 
char p = (char)num; //char = 1; 

這是怎麼回事? 是p=num%(127+128)-1p=num%256還是別的? 我需要知道爲什麼p等於1. 謝謝!將int轉換爲char C公式

+1

我的問題是:爲什麼你的編譯器給你沒有錯誤? '我'沒有初始化! – Rizier123 2014-11-22 11:56:06

+0

乍一看,'p'與'num'沒有任何關係,而是沒有顯示的值'i'。錯字? – 2014-11-22 11:56:43

+0

在這種情況下很有可能是'num%256'。 – 2014-11-22 11:59:13

回答

3

簡短的回答:在標準處理器的做法,這是1,因爲65537%256 == 1.原因是一個ksmonkey123解釋。

注意:如果你正在寫127 + 128因爲signed char,這相當於char上時下典型的編譯器的界限,是-128到+127,請記住,值的-128和+127之間的數是( 127 - ( - 128)+ 1),其中產生256,因此使用signed char(-128到127)或unsigned char(0到255)的範圍無關緊要。 Nitpick:實際上,如果分配的值不能在簽名的目標變量中表示,就會得到未定義的行爲,並且根據C標準,所有投注都將關閉。

指定正數不適合無符號變量的值將產生「mod範圍」行爲,如果char有8位,則爲無符號字符的「%256」。將一個負數值賦值爲一個無符號變量將導致標準定義的三種可能行爲之一。該實現必須描述該實現使用的行爲。現在,所有非嵌入式C編譯器的行爲就像將2^N的倍數(其中N是目標類型的位數)相加。所以「-510」通過加2 * 256得到+2,然後這個+2被存儲在變量中。

+0

謝謝:)所以%256方法是否正確? 爲什麼它不確定?它不是我把char p = 10000 ;,我把(char)放在大數字之前,所以它會先把它轉換成char,然後把它放到char變量中。 – Xiobiq 2014-11-22 13:01:59

+1

第一次:轉換對生成的代碼沒有影響。編譯器非常清楚目標是char變量,因此它必須將該值轉換爲char。該轉換隻會使* implicit *轉換和顯式轉換,而不會改變行爲。許多編譯器會在隱式縮小轉換時發出警告(因爲您可能會失去精度),同時他們對顯式轉換保持沉默(如您明確要求的那樣失去精度)。第二:對於未定義的事實,我在C11最終草案方面其實是錯誤的。 – 2014-11-22 13:10:15

+1

C11最終草案的第6.3.1.3節http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf指出,在這種情況下,行爲是實現定義的值(「算法「必須被記錄並且一致)或者導致實現定義的信號。這與C99(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf) – 2014-11-22 13:13:12

6

,因爲65537是二進制00000000 00000001 00000000 00000001,但char類型只有1個字節,最後一個字節被認爲是char值,至極爲00000001 = 1

+0

65537 = 2 ** 16 + 1 ... – peterh 2014-11-22 12:09:22

+0

這個答案基本上是正確的(只是刪除「不確定」,並修復3個最左邊的字節值)。 – 2014-11-22 12:10:26

+0

謝謝。我想我在轉換工具中創建了一個類型... – ksmonkey123 2014-11-22 12:40:44