1

ご存知のとおり、印刷可能な各文字にはASCII値があります。8文字のASCII値を64ビット整数にしようとしていますが、32ビットしかコピーされません。

char * ch = "AAAABBBB";
unsigned long int i;

//copy charater's ascii to 64 bits int
memcpy(&i, ch, 8);
printf("integer hold: 0x%x\n", i); 

このコードに何か問題がありますか?

私が期待する出力は次のとおりです。

integer hold: 0x4141414142424242

しかし、出力は次のとおりです。

integer hold: 0x41414141
4

3 に答える 3

2

unsigned longが実際に 64 ビット型である場合(sizeof(unsigned long)これを確認するために出力できます)、書式%lx文字列を使用して出力する必要があります。

unsigned longが 32 ビットの場合は、おそらくフォーマット文字列に頼ってunsigned long long使用する必要があります。%llx

からC11 7.20.6.1 The fprintf function:

o,u,x,X unsigned int 引数は、スタイル dddd で、符号なし 8 進数 (o)、符号なし 10 進数 (u)、または符号なし 16 進数表記 (x または X) に変換されます。文字 abcdef は x 変換に使用され、文字 ABCDEF は X 変換に使用されます。精度は、表示される最小桁数を指定します。変換される値をより少ない桁数で表すことができる場合は、先行ゼロで拡張されます。デフォルトの精度は 1 です。0 の値を精度 0 で変換した結果は文字ではありません。

l (エル):後続の d、i、o、u、x、または X 変換指定子が long int または unsigned long int 引数に適用されることを指定します。

ll (ell-ell):続く d、i、o、u、x、または X 変換指定子が long long int または unsigned long long int 引数に適用されることを指定します。

于 2013-02-05T04:19:58.037 に答える
-1

longlong long

VC++ では、longデータ型はまだ 32 ビットのみです。

そしてもちろん、ほとんどのプラットフォームで 32 ビットのprintfフォーマット%xが使用されます。int必要です%llx(または%lxlongすでに64ビットの場合)。

于 2013-02-05T04:19:10.673 に答える
-1

%x は unsigned int 値とその 32 ビットを出力するために使用されるため、このような結果が得られます。

%d %i     Decimal signed integer.
%o        Octal integer.
%x %X     Hex integer.
%u        Unsigned integer.
%c        Character.
%s        String.
%f        double
%e %E     double.
%g %G     double.
%p        pointer.

&残りのデータを印刷したい場合は...

int *p;
p=(char *)(&i)+4;

printf("integer hold: 0x%x\n", i);
printf("integer hold: 0x%x\n",*p);
于 2013-02-05T04:31:23.147 に答える