2017-09-09 7 views
0

다음과 같은 질문이 있습니다. 나는 코드를 준 :C에서 유형 변환이 발생하는 경우

uint8_t a = 0x30; 
uint16_t b = a << 8; 

a 먼저 이동 한 후 uint16_t로 변환 할 것인가? 또는 먼저 uint16_t으로 변환됩니까? 또는이 동작 컴파일러가 종속적입니까? 난 uint16_t lsb 및 msb 별도로 uint8_t s 빌드하려고 해요.

P. 이 동작이 C 또는 C++인지 여부에 달려 있다는 것을 몰랐습니다. 누군가 두 경우 모두 작동하는 방법을 알려주시겠습니까?

+1

C! = C++. 먼저 실제로 사용하고있는 언어를 결정하고 해당 언어로만 태그를 지정하십시오. – tambre

+2

C 또는 C++? 그것들은 두 개의 아주 다른 언어입니다. 특히 의미론에 있어서는 말이죠. –

+1

이 동작은 c 또는 C++인지 여부에 따라 달라집니다. –

답변

4

C에서 표현식 평가는 표현식 트리에서 아래쪽에 있습니다. 즉, a << 8이 이니셜 라이저로 사용되기 전에 먼저 평가됩니다 (분명히). C의 타입 시스템은이 평가를 따르지 만, 아래를 보면, =의 오른쪽에있는 타입은 왼쪽의 타입과 아무런 관련이 없습니다. 형식 자체가 암시 적 변환으로 조정되는 것은 초기화에만 해당됩니다. 그들은 첫 눈에 보이는 것보다이 a (대부분)는 좁은 유형에 대한 유형을 선택했기 때문에 말했다

는 상황이 더 a << 8 여기 복잡합니다. 따라서 대부분의 아키텍처에서 은 int보다 좁기 때문에 모든 산술 표현식에서이를 승격합니다. 그래서 여기에 귀하의 경우 당신에게 int8 작품에 따라서 왼쪽 시프트, 다음 intuint16_t로 변환되어 줄 것이라고

.

a의 상수를 HO 비트 1으로 선택했다면 그림이 달라집니다. 아키텍처에 따라 (int이 16 비트 인 경우) 1을 부호 비트로 이동할 수 있으며 동작은 정의되지 않습니다.

이러한 복잡한 인수는 일반적으로 좁은 정수 유형을 사용하여 산술을 수행하는 것이 좋지 않다는 것을 보여줍니다.

+0

피연산자가 int보다 좁은 산술 연산에서 연산을 수행하기 전에 int로 승격됩니까? –

+0

그리고 int가 16 비트이고 a가 0xF0이면 어떻게 될까요? 어느 시점에서 잘못 될까요? –

+0

왼쪽 쉬프트는 1을 부호 비트로 쉬프트합니다. 이것은 허용되지 않습니다. –