3

x86 または x64 コンピューターで、このプログラムが 0xFFFF を出力しない可能性はありますか? それとも、問題なく動作することが保証されていますか?

#include <stdlib.h>
#include <stdio.h>


int main()
{
    unsigned short int s = 0;
    unsigned long int l = 0xFFFFFFFF;
    memcpy(&s, &l, sizeof(short));
    printf("0x%.4X", s);
    return 0;
}   
4

3 に答える 3

5

C はデータ型の最大サイズを保証しないためunsigned long、最初のバイトのアドレスがunsigned long(つまりビッグ エンディアン) ) これはFFFF結果を生成しません。

于 2013-10-12T00:17:55.960 に答える
2

いいえ.4指定子 forprintfは最大値ではなく最小値を指定するためです。16 ビットではなく 32 ビットの場合short int(標準では最小サイズしかないため許可されています)、代わりに「0xFFFFFFFF」が出力されます。

それ以外の場合、x86 と x64 がリトル エンディアンであるとすると、"FF" バイトが long int の先頭に格納されるため、通常はこれが発生します。long int はビットパターン「FF FF FF FF」で、short int は最初から取っています。

long int が 64 ビットの場合でも、"FF" バイトは先頭にあります: "FF FF FF FF 00 00 00 00"。

次の出力でも、"0xFFFF" が出力されます。ここでは、long int の FF バイトが少なくなっています。

#include <stdlib.h>
#include <stdio.h>


int main()
{
    unsigned short int s = 0;
    unsigned long int l = 0xFFFF;
    memcpy(&s, &l, sizeof(short));
    printf("0x%.4X", s);
    return 0;
}
于 2013-10-12T00:33:06.287 に答える
1

x86/x64がリトルエンディアンであることを考えると、答えはイエスだと思います。

于 2013-10-12T00:17:34.020 に答える