#include <stdio.h>
int main(void)
{
int i = 258;
char ch = i;
printf("%d", ch)
}
出力は2です!
変数の範囲はどのように機能しますか? c言語のさまざまなデータ型の範囲は何ですか?
小さい型に代入する場合の値は
258 % 256
新しい型が符号なしの場合それ以外の場合、新しい型が符号なしの場合は、値が 新しい型の範囲内になるまで、新しい型で表現できる最大値よりも 1 つ多い値を繰り返し加算または減算することによって、値が変換されます。
それ以外の場合、新しい型は署名され、値を表現できません。結果が実装定義であるか、実装定義のシグナルが発生します。
したがって、「加算または減算」という派手なすべては、次のように割り当てられることを意味します。
ch = i % 256;
char
長さは 8 ビットですが、258
表すには 9 ビットが必要です。に変換すると、バイナリchar
の最上位ビットが切り捨てられ、バイナリの になります。258
100000010
10
2
に渡すchar
とprintf
、 に昇格し、フォーマット指定子int
によって取得され、として出力されます。%d
2
#include <stdio.h>
int main(void)
{
int i = 258;
char ch = i;
printf("%d", ch)
}
これi
が0000000100000010
マシンレベルです。ch
1バイトかかるので、最後の8ビットがかかります。つまり、00000010
2です。
さまざまなタイプが C 言語でどのくらいの長さであるかを調べるには、limits.h (または C++ では climits) を参照する必要があります。char の長さが 8 ビットであることは保証されていません。それはただです:
基本文字セットを格納できる、マシンのアドレス指定可能な最小単位。整数型です。実際の型は、実装に応じて符号付きまたは符号なしのいずれかになります
他のタイプについても、同様のあいまいな定義が適用されます。
または、演算子sizeof
を使用して、型のサイズをバイト単位で動的に調べることができます。
ネイティブ C データ型の正確な範囲を想定していない場合があります。標準では最小限の制限しか設けていないunsigned short
ため、少なくとも 65536 個の異なる値を保持できると言えます。上限は異なる場合があります
詳細については、ウィキペディアを参照してください
char は8 ビットなので、 32 ビットマシンでキャスト (整数を char に割り当てる) すると、i (int は 32 ビット) var は次のようになります。
00000000 00000000 00000001 00000010 = 258 (in binary)
この int から char が必要な場合は、最後の 8 ビット (char は 8 ビット) を切り捨てるので、次のようになります。
00000010 は、10 進数で 2 を意味します。これが、この出力が表示される理由です。
よろしく。
これはオーバーフローです。(未定義の動作) または(明確に定義された「ラップアラウンド」動作) のchar
可能性があるため、結果は未定義です。signed
unsigned
リトルエンディアンマシンを使用しています。
258 のバイナリ表現は
00000000 00000000 00000001 00000010
整数を char に代入すると、8 バイトのデータのみが char にコピーされます。すなわちLSB。
ここでは、00000010
つまり 0x02 のみが char にコピーされます。
ビッグエンディアンのマシン の場合、同じコードはゼロを返します。