关于数字表示

| 如何找到所用系统的数字表示形式?     
已邀请:
AFAIK每台现代计算机在代表数字时都使用二进制。已经对其他类型的计算机进行了实验,但是它们无法与二进制竞争。 但是,他们正在使用量子计算机,它们的工作原理完全不同,并且以完全不同的方式表示数字。     
通常的方法是将数字存储在内存中,然后检查内存。
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\';
为“ 1”致歉;我不记得严格的别名规则,也不想现在就查找它们。     
要知道符号表示实际上是很简单的。看一下结果
(favoriteType)-1 & (favoriteType)3 
一旦您了解了C允许的三种不同符号表示的工作方式(例如,参见Acme的答案),您将很容易为它们计算出这样一个表达式的值。     
硬件和/或OS和/或编译器文档可以最好地回答体系结构性问题,例如表示形式(字长,二进制对一个补码对一个符号幅度)和字节序。 您可以使用punning类型检查值的各个字节:
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更好。     

要回复问题请先登录注册