2011-07-09 8 views
0

文字列内の2番目の文字のint値が必要です。 ASCII値ではなく、そこに格納されているものだけです。この変換はどのようにCで動作しますか?

int strLen = 0; 
char str[] = { 'b', 3, 'd', 'e', 'f' }; 

strLen = strLen | *(str + 1);  

/* this prints 3; it's OK */ 
printf("strLen => %d\r\n", strLen);  

さて、これは3である第二のcharの値が、また、98である「B」の値を取得しますので、私は3以外の何かで終わるだろう、何をしていますが欲しいです。

しかし、これはあまりにも動作し、結果はまだ3:

strLen = *(str + 1); 

printf("strLen => %d\r\n", strLen); 

誰もが理由を説明することはできますか?ゼロと

+1

これはCGに関する質問ではありません。 [よくある質問](http://codegolf.stackexchange.com/faq)を読んでください。 – Alexandru

+0

よろしくお願いします。 SO –

+0

はい。私はそれがより適していると思う。 – Alexandru

答えて

4

コア誤理解を推測を取るには、ここで私は、ここでのコードの減少部分に集中したい:

int strLen = 0; 
char str[] = { 'b', 3, 'd', 'e', 'f' }; 
strLen = *(str + 1); 

最後の行が代入されます。右側(*(str + 1))はcharタイプです。左側はintです。大きな整数型に小さな整数型を割り当てるときのコンパイラは、大きい型の小さな型付き式の値を表現すると簡単です。

だから、割り当てが

strLen = 3; 
+0

'strLen'の左側の3バイトにどのような値が入りますか?左からのそれらのバイトは割り当てで全く変わるでしょうか? –

+1

@ camilin87余分なバイトはゼロに設定されます。これはstrLenを3(= 0x03)に設定したあと、strLenを3(= 0x00000003)にしたい場合と同じように論理的です。 – marinus

+4

@ camilin87: '*(str + 1)'で読み取られた値は 'char'値です。これは符号付きでも符号なしでも可能ですが、1バイトしか読みません。 'str'の周囲のバイトは無視されます。 'int 'に変換されると、その値は1バイト値から4バイト値(通常は)に変換され、値は保持されます。 'char'が符号付きの型であれば、符号拡張で変換されます(負の値は負のままであり、正の値は正のままです)。 'char'が符号なしであれば、それはより重要なバイトの0で埋められることによって変換されます(変換前に正の値をとる前に何が陽性であったか)。 –

3

ビット単位または-INGの何かあなたのオリジナルの結果与える:だから、ビット線を追加または何もしないstrlen = 0

strLen | *(str + 1) == *(str + 1) 

与えられたので、あなたの例の両方

x | 0 == x 

をまったく同じなので、もちろん同じ結果が得られます。何故か、最初のケースでビット単位で、あるいはそこに何らかの理由で置かれた理由は明確ではなく、それは目的を果たさない。

いずれの場合でも、char *であるため、strの任意の参照解除(追加を含む)は、常に1文字のcharになります。 * str == 'b'、*(str + 1)== 3、*(str + 2)== 'd'など配列から2つ以上の文字を取得したい場合は、 2つの文字:

printf("%d %d\r\n", *str, *(str+1)); 
2

に相当し、あなたが状況を持っているものメンタルモデルうまくすることは困難であるため、これは答えるのが難しい質問です。

文字列内の2番目の文字のint値が必要です。 ASCII値ではなく、そこに格納されているものだけです。

ストリングに第二チャーに記憶された値はstr[1]又は*(str + 1)又はおそらく*++strを介してアクセスされます。結果は文字列に格納された値です。サンプルの文字列では、値は3です。この文字はCONTROL-Cとも呼ばれます。これは、数字「3」に格納される値とは異なります。これは通常、51として保存されます(ISO 8859-1に基づくコードページまたはASCIIと同じ文字コード割り当てを使用するその親族の1つを想定)。

strLen = 0;、次いでstrLen = strLen | *(str + 1);

は、同じ結果を得る: strLenが今3

印刷ステートメントは、文字列に整数値3に変換値を含む、両方の場合において

strLen = str[1]; 
strLen = *(str + 1); 

れます

strLen => 3 

と、それに続くCRとLFが含まれます。 (CRはWindowsマシンであっても必要ありませんが、それは手元の問題からの転換です。)

これらの文字は標準出力に送られます。出力の位置10の値(0から数えて)は、'3'(通常は51)と同じで、文字列に格納されている値3とは異なります。書式がこの変換を要求しました。あなたが文字を印刷したい場合は、そう言う:

printf("strLen => %c\n", strLen); 

これは出力にCONTROL-Cを出力します。どのように見えるかは、端末ドライバと端末の設定によって異なります。

関連する問題