2
#include <stdio.h>

int main(void)
{ 
    int i = 258;
    char ch = i;
    printf("%d", ch)
}

出力は2です!

変数の範囲はどのように機能しますか? c言語のさまざまなデータ型の範囲は何ですか?

4

7 に答える 7

4

小さい型に代入する場合の値は

  • 切り捨てられた、つまり258 % 256新しい型が符号なしの場合
  • 新しい型が署名されている場合、実装定義の方法で変更されます

それ以外の場合、新しい型が符号なしの場合は、値が 新しい型の範囲内になるまで、新しい型で表現できる最大値よりも 1 つ多い値を繰り返し加算または減算することによって、値が変換されます。

それ以外の場合、新しい型は署名され、値を表現できません。結果が実装定義であるか、実装定義のシグナルが発生します。

したがって、「加算または減算」という派手なすべては、次のように割り当てられることを意味します。

ch = i % 256;
于 2012-07-29T11:37:51.947 に答える
3

char長さは 8 ビットですが、258表すには 9 ビットが必要です。に変換すると、バイナリcharの最上位ビットが切り捨てられ、バイナリの になります。258100000010102

に渡すcharprintf、 に昇格し、フォーマット指定子intによって取得され、として出力されます。%d2

于 2012-07-29T11:39:27.057 に答える
1
#include <stdio.h>

int main(void)
{ 
    int i = 258;
    char ch = i;
    printf("%d", ch)
}

これi0000000100000010マシンレベルです。ch1バイトかかるので、最後の8ビットがかかります。つまり、000000102です。

于 2012-07-29T11:53:36.643 に答える
1

さまざまなタイプが C 言語でどのくらいの長さであるかを調べるには、limits.h (または C++ では climits) を参照する必要があります。char の長さが 8 ビットであることは保証されていません。それはただです:

基本文字セットを格納できる、マシンのアドレス指定可能な最小単位。整数型です。実際の型は、実装に応じて符号付きまたは符号なしのいずれかになります

他のタイプについても、同様のあいまいな定義が適用されます。

または、演算子sizeofを使用して、型のサイズをバイト単位で動的に調べることができます。

ネイティブ C データ型の正確な範囲を想定していない場合があります。標準では最小限の制限しか設けていないunsigned shortため、少なくとも 65536 個の異なる値を保持できると言えます。上限は異なる場合があります

詳細については、ウィキペディアを参照してください

于 2012-07-29T12:04:09.897 に答える
1

char は8 ビットなので、 32 ビットマシンでキャスト (整数を char に割り当てる) すると、i (int は 32 ビット) var は次のようになります。

00000000 00000000 00000001 00000010 = 258 (in binary)

この int から char が必要な場合は、最後の 8 ビット (char は 8 ビット) を切り捨てるので、次のようになります。

00000010 は、10 進数で 2 を意味します。これが、この出力が表示される理由です。

よろしく。

于 2012-07-29T13:24:37.933 に答える
0

これはオーバーフローです。(未定義の動作) または(明確に定義された「ラップアラウンド」動作) のchar可能性があるため、結果は未定義です。signedunsigned

于 2012-07-29T12:55:11.907 に答える
0

リトルエンディアンマシンを使用しています。

258 のバイナリ表現は

00000000 00000000 00000001 00000010

整数を char に代入すると、8 バイトのデータのみが char にコピーされます。すなわちLSB。

ここでは、00000010つまり 0x02 のみが char にコピーされます。

ビッグエンディアンのマシン の場合、同じコードはゼロを返します。

于 2012-08-01T11:31:17.837 に答える