-2

私は非常に混乱しています。頭痛がします。私はCに不慣れです。

#include<stdio.h>

int main()
{
int i = 257;
int *iPtr = &i;    

printf("val 1: %d \t val 2: %d \n\n",*( (char*)iPtr ), *( (char*)iPtr+1) );

int iptr_alias = iPtr;
int and_val = iptr_alias & 255;

printf("Value of iPtr (aka address of i): %d   \n\n", iPtr);
printf("Value at location pointed to by iPtr using %%c: %c \n\n",*iPtr); //gives weird character


int f = 257;
int *fptr = &f;


printf("char starred fptr: %d \t charred 257: %d \n\n",*((char*)fptr), ((char)257) );
// i know the above is obvious. 
system("PAUSE");
}

私の質問:

1.どうやら*( (char*) iPtr )== 257 & 2551(ビット単位および演算)。そして(char)*iPtr、同じです。しかし、修飾子1を使用すると印刷されません。%cなんで?

2.そしてなぜ*( (char*) iPtr+1 )=1??

私はこれらすべてにとても混乱しています(混乱を解消するために自分で書いたのですが、そうでなければうまくいきました..)

((char)257)1そのことについては、 using%dまたは%oまたは%xを与えます。%c奇妙なASCII文字を与える

つまり、私がそうするとき、printf(" %c ", 257)私は得られません1、代わりに、私は奇妙なASCII文字を手に入れます。なんで?

実際の問題では、ととして何が印刷されるかを決定することになっていましval 1val 2

ばかげて単純なものを見落としているかもしれませんが、この混乱に本当に混乱して疲れています。助けてください。

4

2 に答える 2

1

acharはわずか8ビットであるため、0から255までの数値を表すことができることに注意してください。印刷257すると、ロールオーバーして1になります(256ゼロになります)。

なぜ257(すなわち1)が変な文字になるのかについては、ASCIIテーブルに誘導します。

編集:signed対についてunsigned

この場合、charタイプはunsignedです。その場合signed、ロールオーバーはで発生し127ます(ただし、符号付き/符号なしの動作により、にロールオーバーされ-128129にロールオーバーされ-127ます)。

于 2012-09-25T16:57:47.607 に答える
1

整数257も16進数で0x101です。32ビット整数のリトルエンディアンマシンでは、個々のバイトは0x01 0x010x000x00になります。

于 2012-09-25T17:11:48.037 に答える