0

C または C99 をいじって、キャスト、ビットシフト、および 16 進値がどのように機能するかを理解しようとしています。

次の問題があります

char c[4];
c[0] = 0x41;
c[1] = 0x42;
c[2] = 0x43;
c[3] = 0x00;
printf("%s", c); //prints ABC
printf("%X", c); //prints 99B11760

99B11760 はどこから来たのですか?

だから同じように...

int main() {
    char a = 'a'; //ascii value is 0x41 (Mistake I made, 'a' is 0x61, 'A' is 0x41) 
    printf("%X\n",a); //outputs "61"? (THIS IS CORRECT OUTPUT, 'a' != 0x41)
}

Hex値をcharに格納するという同様の問題を解決する方法の解決策を見つけ続けていますが、理解に苦労しているのは、格納された値の一部がASCII値に対応していない理由または場所です。ASCII 16 進値、10 進値、8 進値のいずれでもないため、printf("%X\n", c); を使用したときに出力される値は何ですか。

4

6 に答える 6

1

99B11760 はどこから来たのですか?

cこれは、強制的にポインターに減衰させた後にたまたま持っていた値です。

この問題を解決するための解決策を見つけ続けています

何の問題?やろうとしているのに、やり方がわからないことはありますか? 「意味のないことをして、意味のない答えが返ってきた」は問題ではありません。それをしないでください。

..しかし、私が問題を抱えているのは、ASCII 16進値0x41の代わりに61が印刷されている理由または場所を理解することです。これは 10 進値でも 8 進値でもありません。

ご覧のとおり、あるべき特定の値はありません。しかし、それは何かでなければなりません。空中にサイコロを投げて 2 が出たら、なぜ 2 なのか不思議に思いませんか? もちろん違います。あるべきものがのものである場合にのみ、問題が発生します。この場合、あってはならないことは何もありません。

于 2012-04-09T10:12:33.310 に答える
1

C の配列変数は、アドレス値 (別名ポインター値) に自動的に変換できます。表示されている出力は、配列の内容とはまったく関係ありません。

おそらくあなたはこれをするつもりでしたか?

char c[4];
c[0] = 0x41;
c[1] = 0x42;
c[2] = 0x43;
c[3] = 0x00;
printf("%X", *(unsigned int*)c );
于 2012-04-09T10:10:40.053 に答える
0
int main() {
char a = 'a'; //ascii value is 0x41
printf("%X\n",a); //outputs "61"?
}

この場合、最初に「a」(ascii 値 = 97) を文字 a に格納しているため、文字 a には 97 が含まれており、次に 97 を 16 進数形式で「0x61」として出力しています。

char c[4];
c[0] = 0x41;
c[1] = 0x42;
c[2] = 0x43;
c[3] = 0x00;
printf("%s", c); //prints ABC
printf("%X", c); //prints 99B11760

この場合

         '0x41' in decimal value is 65 is 'A' in ASCII
         '0x42' in decimal value is 66 is 'B' in ASCII
         '0x43' in decimal value is 67 is 'C' in ASCII   
         '0x00' in decimal value is 00 is null in ASCII   

書式指定子が文字/文字列型の場合、「ABC」を出力します

于 2012-04-09T10:23:16.227 に答える
0
 printf("%X", c); //prints 99B11760

これにより、未定義の動作が発生します。x変換指定子は を期待してunsigned intいますが、 を渡していますchar *

質問の 2 番目の部分では、にキャストaする必要がありますunsigned int

printf("%X\n", (unsigned int) a);

Aascii 値は ですが0x41aascii 値は0x61.

于 2012-04-09T10:08:19.683 に答える
0

最初の質問では、 formatcを使用し%Xて印刷すると、配列のアドレス (最初の文字のアドレス) が印刷されます。2 番目の質問の場合、これは の ASCII 値aが 97 (10 進数) で、16 進数に変換すると 61Aになるためです。文字を使用すると、大文字の ASCII 値Aが 65 であるため、41 が出力されます。

于 2012-04-09T10:08:47.437 に答える
0

cはポインターであるため、何かを使用して印刷する%sと、ポインターアドレスが印刷されます。

于 2012-04-09T10:09:01.620 に答える