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로 변환하지 않았습니다.
구체적 답변은 [C11 표준 - 6.3.1.8 일반적인 산술 변환 (초안 n1570)]입니다 (http://port70.net/~nsz/c/c11/n1570.html#6.3.1.8) –
둘 다 '0xFF '와'0x000000FF'는 C에서 같은 타입과 같은 값을가집니다. 단지 출력 형식이 다릅니다 –
user1597336, 호기심, 포맷이''0x % X ''대신에''% d "'였으면, 'getByte (x, n)'로부터의 4 바이트'int' 리턴에 대해 "255"또는 "0000000255"를 예상 했습니까? – chux