2017-12-08 4 views
2

4 바이트 정수에서 모든 단일 바이트의 데이터를 추출하기 위해 코드를 작성하려고합니다. 실제로 찾은 작은 비트 이후에
코드가있는이 달성 될 수있다,하지만 난 그것을 출력이 생성되는 방식으로 작동 이유를 알고 그냥 궁금, 아래의 코드를입니다우리가 2 바이트 숫자로 4 바이트 수를 AND 연산 할 때 어떻게 될 것인가

#include <stdio.h> 

int getByte(int x, int n); 

void main() 
{ 
    int x = 0xAABBCCDD; 
    int n; 

    for (n=0; n<=3; n++) { 
     printf("byte %d of 0x%X is 0x%X\n",n,x,getByte(x,n)); 
    } 

} 

// extract byte n from word x 
// bytes numbered from 0 (LSByte) to 3 (MSByte) 
int getByte(int x, int n) 
{ 
    return (x >> (n << 3)) & 0xFF; 
} 

출력 :

byte 0 of 0xAABBCCDD is 0xDD 
byte 1 of 0xAABBCCDD is 0xCC 
byte 2 of 0xAABBCCDD is 0xBB 
byte 3 of 0xAABBCCDD is 0xAA 

결과 전 하지만 4 바이트 숫자로 AND 연산을 수행하고 대신 1 바이트의 데이터 만 포함하고 4 바이트의 데이터로 구성된 출력을 생성하지 않았기 때문에 컴파일러는 0xFF를 0x000000FF로 변환하지 않았습니다.

+0

구체적 답변은 [C11 표준 - 6.3.1.8 일반적인 산술 변환 (초안 n1570)]입니다 (http://port70.net/~nsz/c/c11/n1570.html#6.3.1.8) –

+1

둘 다 '0xFF '와'0x000000FF'는 C에서 같은 타입과 같은 값을가집니다. 단지 출력 형식이 다릅니다 –

+0

user1597336, 호기심, 포맷이''0x % X ''대신에''% d "'였으면, 'getByte (x, n)'로부터의 4 바이트'int' 리턴에 대해 "255"또는 "0000000255"를 예상 했습니까? – chux

답변

3

출력 은 4 바이트 수인이지만, printf("%X")은 앞에 오는 0 자릿수를 인쇄하지 않습니다.

printf("foo 0x%X bar\n", 0x0000AA)을 입력하면 foo 0xAA bar이 출력됩니다.

4

컴파일러에서 0xFF0x000000FF으로 변환했습니다. 값은 정수 상수이기 때문에 0xFF은 내부적으로 32 비트 값으로 변환됩니다 (플랫폼에 32 비트 int이 있다고 가정). 값이 다시 얻을

주, 즉 0xDD, 0xCC, 0xBB0xAA는 또한 int의, 그래서 당신은 실제로 0x000000DD, 0x000000CC 등 수 있도록 그들이뿐만 아니라, 앞에 0이있다. 당신이 그들을보고 싶은 경우에, 당신이 맨 앞에 0을 요청하는 형식 문자열을 변경해야하는 것 때문에 선행 제로 포함되어야하지만, 자동으로 인쇄되지 않습니다

for (n=0; n<=3; n++) { 
    printf("byte %d of 0x%08X is 0x%08X\n", n, x, getByte(x,n)); 
} 

Demo.

+0

사소한 세부 사항 : C에서'0xFF'는 정수형이며 정수형입니다 -이 경우에는'int' 형입니다. C의 2 개의 _literals_ : _string 리터럴 _ 및 _compound 리터럴 _은 주소를 가져올 수 있습니다. 0xFF는 할 수 없습니다. C++와 같은 다른 언어에서 '0xFF'는 주소를 가져올 수 있으며 리터럴이라고합니다. – chux

+0

@ dasblinkenlight : 정보 주셔서 감사합니다. 완전한 숫자를 앞에 오는 0으로 인쇄하는 데 대한 설명을 공유하십시오. – user1597336

+0

방금 ​​언급 한 형식 지정자를 사용하여 아래 코드를 https : //www.onlinegdb에서 온라인으로 실행했습니다.com/online_c_compiler printf ("0x % X의 바이트 % d는 0x08 % X \ n", n, x, getByte (x, n)); 0xAABBCCDD의 바이트 0은 0x08DD – user1597336

0

를 0xFF와 0x000000FF 당신이 당신의 출력을 인쇄 할 경우 모두 정확히 같은 것은, 기본적으로 서식을 선도 0의 떨어질 것이다, 당신은 단지를 지정해야합니다

printf("byte %d of 0x%X is 0x08%X\n",n,x,getByte(x,n)); 

을하지만 바이트를 인쇄하고 있기 때문에 나는 아니에요 왜 네가 기대할 수 있는지 확실히 확신 해. 0을 선도하는 e.

관련 문제