2017-12-08 11 views
2

4バイト整数から1バイトのデータをすべて抽出するコードを書こうとしています
2バイト数の4バイト数のAND演算を行うとどうなるのですか

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

結果I:以下、これを達成することができますが、私はそれが出力を作成するように動作し、なぜ知っているだけで好奇心れるコードは、コード

#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; 
} 

が出力されていますコンパイラが0xFFを0x000000FFに変換しなかった理由は、4バイトの数でAND演算を実行し、代わりに4バイトのデータではなく1バイトのデータのみからなる出力を生成するためです。

+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があるものとします)。値は、あなたが戻って取得することを

注、すなわち0xDD0xCC0xBB、および0xAAは、またint秒なので、あなたが実際に0x000000DD0x000000CC、というように取得するので、彼らは、同様に先行ゼロを持っています。先頭のゼロとはいえ、自動的に印刷されませんので、あなたがそれらを見たい場合は、含まれる先行ゼロを要求するフォーマット文字列を変更する必要があるだろう:

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'は整数であり、_intest_ではありません。この場合は' int'型です。 C's 2 _literals_:_stringリテラル_と_compoundリテラル_はアドレスを取ることができます。 '0xFF'はできません。 C++のような他の言語では、 '0xFF'はそのアドレスを取ることができ、リテラルと呼ばれます。 – chux

+0

@ dasblinkenlight:情報ありがとうございました。完全な数字を先行ゼロで印刷するためのステートメントを共有してください。 – 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)); 

しかし、あなたはバイトを印刷しているので、私はしませんよなぜあなたが期待するのかeの先頭に0があります。

関連する問題