Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.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++_C_Compiler Construction_Representation_Negative Number - Fatal编程技术网

C++ 编译器和负数表示法

C++ 编译器和负数表示法,c++,c,compiler-construction,representation,negative-number,C++,C,Compiler Construction,Representation,Negative Number,最近,我被这件事弄糊涂了。可能是因为我没有阅读语言规范(我知道这是我的错) C99标准并没有规定编译器应该使用哪种负数表示。我一直认为存储负数的唯一正确方法是二的补码(在大多数情况下) 所以我的问题是:你知道现在有哪种编译器默认实现补码或符号大小表示吗?我们可以用一些编译器标志来更改默认表示吗 确定使用哪种表示的最简单方法是什么 和C++标准?我认为这不是一个问题,而是编译器使用什么表示,而是底层机器使用什么表示。如果编译器选择目标机器不支持的表示形式,那将是非常愚蠢的,因为这将引入大量开销,而

最近,我被这件事弄糊涂了。可能是因为我没有阅读语言规范(我知道这是我的错)

C99标准并没有规定编译器应该使用哪种负数表示。我一直认为存储负数的唯一正确方法是二的补码(在大多数情况下)

所以我的问题是:你知道现在有哪种编译器默认实现补码或符号大小表示吗?我们可以用一些编译器标志来更改默认表示吗

确定使用哪种表示的最简单方法是什么


和C++标准?

我认为这不是一个问题,而是编译器使用什么表示,而是底层机器使用什么表示。如果编译器选择目标机器不支持的表示形式,那将是非常愚蠢的,因为这将引入大量开销,而不会带来任何好处

IP协议套件中的某些校验和字段使用一个补码,因此可能需要专用的“网络加速器”类型的CPU来实现它。

虽然表示法是目前为止最常见的,但它不是唯一的表示法()。C和C++标准化委员会不希望非二进制补码机器模拟非本地表示。因此,C和C++都不需要特定的负整数格式。 这导致了在有符号类型上按位操作的未定义行为。

实现补码数学的,仍然与一些相当更新的编译器一起使用。你可以在下面的问题中了解更多


有用于“网络加速器”类型CPU的C编译器吗?@klew:我在谷歌上搜索了几分钟后就找不到了,但这证明不了多少。:)是的,但这不是我要问的。你知道有哪个C编译器在默认情况下会使用非2的completeMet吗?那些用于使用非tows补码的系统的编译器。。。显然,它包括一些仍然受支持的Unisys框(这可能在第二个链接中列出)。我想您可以通过检查有符号值的二进制表示来确定使用哪个实现,类似于endianness检查的方式。这可能是在编译时定义和评估的过程中完成的。我的意思是,如果你在过去6年中没有解决这个问题:可能的副本