2013-08-17 5 views
2

C에서 char에 int를 할당하면 어떻게됩니까? 항상 왼쪽의 여분의 비트를 무시합니까?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 

, 500이다 11111010024411110100가있다.

+0

@WhozCraig 부호없는 정수 오버 플로우가 정의됩니다 (오버플로 값은 모듈로 'UINT_MAX + 1'이됩니다). –

+0

@ H2CO3 맞습니다. 서명되지 않은 오버플로 할 수 없습니다 (그리고 나는 잘 알고, 내가 [이 답변을 쓴 고려 고려] (http://stackoverflow.com/questions/13600991/why-is-a-negative-int-greater-than-unsigned-int/ 13601259 # 13601259)). – WhozCraig

+0

@WhozCraig 걱정하지 마라. 일단 Objective-C를 컴파일 할 때 유형 정보가 코드 생성에 필요 없다고 잘못 선언했다면 (뇌사가 발생하는 이유가 무엇이든). 그리고 몇 분 안에 나 자신을 시정 했음에도 불구하고 어떤 사람들은 내가 무슨 말을하고 있는지 전혀 모른다 고 주장했다. –

답변

6

일반적으로 이것은 정확히 발생합니다. 는 ISO/IEC 9899의 섹션 6.3.1.3 : 2011 표준은이 경우에 발생하는 무슨 규정 :

6.3.1.3 서명 및 부호없는 정수 정수 유형의 값이 변환됩니다

  1. _Bool이 아닌 다른 정수 유형 인 경우 값이 새 유형으로 나타낼 수있는 경우 변경되지 않습니다.
  2. 그렇지 않은 경우 새 유형이 부호가없는 경우 값은 에 의해 새로운 유형의 범위에 도달 할 때까지 새로운 유형으로 나타낼 수있는 최대 값 보다 1을 더하거나 뺍니다. 60)
  3. 그렇지 않으면 새 형식이 서명되고 값이 일 수 없습니다. 결과가 구현 정의 또는 구현 정의 신호가 발생합니다.

60)이 규칙은 지정된 유형의 표현식 값이 아니라 수학적 값에 대한 산술을 설명합니다.

귀하의 사례는 위의 2 번 항목에 해당합니다 (귀하의 캐릭터는 서명되지 않은 것으로 선언되었으므로). 일반적인 컴퓨터 산술에서 결과는 설명 된대로 정확하게 나타납니다.

+0

+1 올바른 답변입니다. # 3은 내가 평범한 논평에서 정신병이 일시적으로 사라지는 동안 간격을 두었다. (방금 그 중 * 일) – WhozCraig

관련 문제