2016-10-27 2 views
1

64 비트 숫자 (0xffffffffffffff8c)를 8 비트 숫자 (0x8c)로 변환하는 방법은 무엇입니까? 내 코드 :64 비트 숫자를 8 비트로 변환하는 방법

uint64_t val = 0xffffffffffffff8c; 
uint8_t var = (uint8_t) (val & 0x0000FF); 

올바른 방법입니까?

+0

[C++ : Bitwise AND] (http://stackoverflow.com/questions/10373240/c-bitwise-and) 가능한 복제본 (C++의 질문이지만 bitwise 연산은 이것과 동일해야합니다. 질문이 관련되어 있습니다.) – cxw

+2

AND가 필요한가요? – hatchet

+1

@hatchet 마스크, 또는 캐스트는 좁힐 수있는 값을 할당하는 것과 관련하여 주의보 경고를 조용히하는 데 유용합니다. – chux

답변

3
uint64_t val = foo(); 

모두 잘 값 대상의 범위를 벗어난 경우에도, 부호 형 값을 할당하는 것은 잘 정의되어 있기 때문에 행동, 방법 4 이하 고려한다. 실제로 유클리드 은 "1에 목적지 유형의 최대 값을 더한 것"입니다.

참고 : 마스크 상수 0x0000FF0은 필수가 아닙니다. 선명도를 전달하기 위해 원하는대로 앞자리 0을 사용하십시오. 0xFF 또는 0x00000000000000FF을 사용할 수 있습니다.


OP 원본 : 문제가 없지만 약간 자세한 내용입니다. val이 정수형 인 한 &이 허용됩니다.

uint8_t var = (uint8_t) (val & 0x0000FF); 

캐스트, 아니 마스크입니다. (uint8_t)으로 캐스팅은 0xFF의 마스크입니다. 일반에서는 마스킹 코드에서 놀라운 효과가 있으므로 마스킹을 피해야합니다. 이 간단한 예제처럼 부호없는 고정 너비 유형으로 변환 할 때는 그렇지 않습니다.

uint8_t var_nm = (uint8_t) val; 

마스크, 아니 캐스트. 위와 같습니다. 값의 범위가 명시 적으로 지정됩니다.

uint8_t var_nc = val & 0xFF; 

없음 캐스트, 아니 마스크입니다. 이것은 작동하지만 동족체 인 [-Wconversion] 또는 이와 동등한 것이 사용되면 아래의 경고가 발생할 수 있습니다. 코드가 좁혀 질 것으로 예상되는지는 명확하지 않습니다.

// warning: conversion to 'uint8_t {aka unsigned char}' from 'uint64_t 
// {aka long long unsigned int}' may alter its value [-Wconversion] 
uint8_t var_nc_nm = val; 

코딩의 목적은 1 인))는 기능이 수행이 합리적 3 효율적으로) 현재와 미래에 목적의 명확성을 촉진 할. 그것은 분명히 두 번째 선택으로 범위 0-FF

uint8_t var_nc = val & 0xFF; 

의 가치를 좁힐 코드의 의도를 전달로 추천, 같은 실행 코드를 생성 할 것으로 예상 단순히

uint8_t var = val; 

에 대한 이동합니다.

-

마이너 다음 이름valvar은 너무 일반적이다.

0

&이나 캐스트가 필요하지 않습니다 (의도를 명확히하기 위해 남겨 둘 수는 있지만). 다른 정수 유형간에 암시 적으로 자유롭게 변환 할 수 있으며 부호없는 정수의 경우 오버플로 비헤이비어 (실제로는 "낮은 바이트 만 사용"으로 종결 됨)가 잘 정의되어 있으며 여기에서 원하는 것을 수행합니다.

관련 문제