私が使用しているシステムの数値の表現を見つけるにはどうすればよいですか?
4 に答える
0
通常の方法は、数値をメモリに保存してから、メモリを検査することです。
volatile number_type x;
x = 512.123;
typedef unsigned char const volatile uccv;
uccv *c = reinterpret_cast< uccv * >( & x );
std::cout << std::hex;
std::cout.fill( '0' );
for ( uccv *pen = c; pen != c + sizeof x; ++ pen ) {
std::cout.width( 2 );
std::cout << static_cast< unsigned >( * pen );
}
std::cout << std::dec << '\n';
申し訳ありvolatile
ません; 厳密なエイリアシング規則を覚えていないので、今は調べたくありません。
于 2011-04-13T19:50:06.073 に答える
0
表現 (ワード サイズ、2 の補数、1 の補数、符号の大きさ) やエンディアンなどのアーキテクチャの問題は、ハードウェアや OS、コンパイラのドキュメントで最もよく答えられます。
型パニングを使用して、値の個々のバイトを調べることができます。
T value = ...; // for some numeric type T (int, short, long, double, float, etc.)
unsigned char *p = (unsigned char*) &value;
size_t i;
printf("%10s%8s\n", "address", "value");
printf("%10s%8s\n", "-------", "-----");
for (i = 0; i < sizeof value; i++)
printf("%10p%8x\n", p+i, (unsigned int) p[i]);
ビッグエンディアンとリトルエンディアンの場合、次のようにすることができます
unsigned int value = 0x01;
unsigned char *p = (unsigned char *) &value;
if (p[0] == 1)
printf("Little-endian\n");
else if (p[sizeof value - 1] == 1)
printf("Big-endian\n");
else
printf("Weird\n");
ただし、RTM のほうがよいでしょう。
于 2011-04-13T20:40:07.377 に答える
0
私の知る限り、最新のコンピューターはすべて、数値を表すときにバイナリを使用します。他の種類のコンピューターで実験が行われましたが、バイナリと競合することはできませんでした。
しかし、それらはまったく異なる働きをし、まったく異なる方法で数値を表現する量子コンピューターを動かしています。
于 2011-04-13T19:30:15.600 に答える
0
符号表現を知ることは、実際には非常に簡単です。の結果を見てください
(favoriteType)-1 & (favoriteType)3
C で許可されている 3 つの異なる符号表現がどのように機能するかを理解したら (たとえば、Acme の回答を参照)、そのような式の値を簡単に計算できます。
于 2011-04-13T20:31:30.933 に答える