2015-01-06 2 views
0

기본 C 질문이 있습니다.데이터 형식 잘림

가정하자 나는 선언하고 표준 16 비트 부호없는 정수를 초기화 한

uint16_t var1 = 0x1234; 

후 나는 8 비트 부호없는 정수를 선언한다고 가정

uint8_t var2; 

나는 할당한다면

var2 = var1; 

이 내용이 유효한 내용입니까? 그리고 다음과 같은 결과를내는 중요한 비트를 간단하게 잘라 버리겠습니까?

var2 == 0x34 

사실로 평가 되나요?

+1

동등한 시도를하고 캐스팅 해보고 컴파일러 경고 및 결과를 살펴보십시오. –

답변

2

난 당신 말은 생각 :

uint16_t var1 = 0x1234; 
uint8_t var2; 
var2 = var1; 

예,이 var1의 데이터 유형에 맞도록 var1을 자릅니다 때문에 var2는 0x34와 동일합니다.

+0

일부 컴파일러 (플래그에 따라 다름)는 변환을 축소하는 것에 대해 경고합니다. 그러나 그것은 단지 완전을위한 것입니다. – Deduplicator

1

예. 컴파일러는 내부적으로 이것을

var2 = (uint8_t)var1; 

으로 해석하여 값이 0x34 인 var2로 변환합니다.

+0

논쟁의 여지가 없습니다. 'int'는 16 비트 이상일 필요는 없다는 것을 기억하십시오. 그리고 캐스트가없는 추가 진단이있을 수 있습니다. – Deduplicator

+0

정수 승격 규칙을 찾으십시오. 추가 진단은 없습니다. 컴파일러는 var1을 int로 변환 할 것이고 (내부적으로) 괜찮은 컴파일러에서는이 경우에 noop이됩니다. –

+0

언급 한 잘린 값을 제외하고는 아마도. Mea culpa. –