2013-08-17 35 views
2

將int分配給C中的char時會發生什麼?它總是忽略左邊的額外位?從int到char的賦值如何在C中工作?

實施例(4個字節INT):

unsigned char c = 0; 
unsigned int i = 500; 

c = i; // c is 244 

c = i <<24>> 24; //c is 244 

i = i <<24>> 24; //i is 244 

在二進制,50011111010024411110100

+0

@WhozCraig定義了無符號整數溢出(它以UINT_MAX + 1爲模過沖值)。 – 2013-08-17 23:50:17

+0

@ H2CO3你是對的。無符號無法溢出(我應該該死的知道,考慮到我寫了[這個答案](http://stackoverflow.com/questions/13600991/why-is-a-negative-int-greater-than-unsigned-int/ 13601259#13601259))。 – WhozCraig

+0

@WhozCraig不用擔心......一旦我錯誤地陳述(無論腦死亡的原因),編譯Objective-C時代碼生成不需要類型信息。儘管我在幾分鐘內糾正了自己,但有些人仍然堅持認爲我不知道我在說什麼......無論如何。 – 2013-08-17 23:54:22

回答

6

通常,這正是發生的情況。在ISO/IEC 9899的第6.3.1.3節:2011標準規定什麼在這種情況下發生:

6.3.1.3符號和無符號整數

  1. 當與整型值轉換爲另一個整數 類型不是_Bool,如果該值可以由新的 類型表示,則該值不變。否則,如果新類型是無符號的,則將該值轉換爲 ,該值反覆增加或減去可以用新類型表示的最大值 ,直到該值處於新類型的 範圍內。 60)
  2. 否則,新類型是有符號的,值不能是 表示的;結果是實現定義的或 實現定義的信號被引發。

60)該規則描述數學值的算術,而不是給定類型的表達式的值。

您的情況屬於上述第2項(因爲您的角色被聲明爲無符號)。在典型的計算機算術中,結果與您所描述的完全相同。

+0

+1這是正確的。這是我在一般評論中暫時失去理智時排除的第三個問題。 (只有一天*) – WhozCraig