-1

如何找到我所在系统的数字表示?

4

4 回答 4

0

诸如表示(字长、二进制补码与符号大小)和字节顺序之类的架构问题最好通过硬件和/或操作系统和/或编译器文档来回答。

您可以使用类型双关语来检查值的各个字节:

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

AFAIK 每台现代计算机在表示数字时都使用二进制。已经用其他类型的计算机进行了实验,但它们未能与二进制竞争。

然而,他们正在使用一种完全不同的量子计算机,并以完全不同的方式表示数字。

于 2011-04-13T19:30:15.600 回答
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

要知道符号表示实际上很简单。看结果

(favoriteType)-1 & (favoriteType)3 

一旦您了解了 C 允许的三种不同符号表示如何工作(参见例如 Acme 的答案),您将很容易为它们计算出这种表达式的值。

于 2011-04-13T20:31:30.933 回答