Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 关于数字表示_C_Computer Architecture - Fatal编程技术网

C 关于数字表示

C 关于数字表示,c,computer-architecture,C,Computer Architecture,在我使用的系统中,如何找到一个数字的表示形式?AFAIK每台现代计算机在表示一个数字时都使用二进制。已经用其他类型的计算机进行了实验,但它们无法与二进制计算机竞争 然而,它们的工作方式完全不同,并且以完全不同的方式表示数字。通常的方法是将数字存储在内存中,然后检查内存 volatile number_type x; x = 512.123; typedef unsigned char const volatile uccv; uccv *c = reinterpret_cast< ucc

在我使用的系统中,如何找到一个数字的表示形式?

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';
volatile number_类型x;
x=512.123;
typedef无符号字符常量volatile uccv;
uccv*c=重新解释铸件(&x);

知道符号表示法其实很简单。看看结果

(favoriteType)-1 & (favoriteType)3 

一旦你理解了C语言所允许的三种不同的符号表示法是如何工作的(参见Acme的答案),你就可以很容易地为它们计算出这样一种表达法的值。

架构问题,如表示法(字数、两个补码与一个补码与符号大小)和endianness最好用硬件和/或操作系统和/或编译器文档来回答

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

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]);

不过,RTM更好

我还是不知道你在问什么?这是大端元还是小端元?数字的表示是什么?大/小尾数或使用
/,
作为浮点数?表示什么数字?中央处理器?档案?在记忆中?你在问你的系统的持久性吗?它是否是有符号整数的2的补码?请说得更具体些。@Nabsure:在99%的情况下,如果你使用的是1的补码计算机,你会知道的,相信我。可能是因为它需要一整个房间,像乌龟一样慢,然后烧煤…@thkala:coal!在我的时代,我们没有你的任何新型煤炭,只有10000名奴隶拉着绳子或什么都没有。哇,仅仅测试一些碎片是多么沉重的机器,这完全是多余的。@Jens:你的解决方案可以区分
int
可能使用的表示。我的解决方案以十六进制打印任何数字,这更具信息性,涵盖了更多的领域。如果你想,并认为OP可以做些什么。但我也无法想象C++中的任何一个整数类型都很难输出,因为使用了混叠和类似的东西。由于此问题也被标记为C,因此
printf
格式为
%x
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");