C ++测试 - 符号位1是否总是表示否定?

时间:2013-03-24 10:10:59

标签: c++ number-formatting

我刚刚接受了C ++测试,我得到了以下错误的问题:

问:以下程序的输出是什么?

#include <iostream>
#include <stdint.h>

using namespace std;

int main() {
    int a = 0;
    for (int8_t i = 1; i > 0; i <<= 1)
        a++;
    cout << a;
    return 0;
}

有以下答案可供选择

  • 8
  • 7
  • 未定义的行为
  • 编译错误

正确的”答案是7.如果答案中有“实施定义的行为”,我会选择,所以我选择了最接近的未定义行为。据我所知,在符号和替换中,1的补码和2的补码答案将是7.但是C ++标准理论上是否允许任何其他数字表示?例如,符号和幅度,但0表示否定?

我是否正确,这个问题的真正正确答案应该是实施定义的行为,如果没有,你可以解释为什么答案是7而不管实施情况如何?

我阅读了问题的评论,看来最初a的类型是char,这显然引发了很多关于char是否签名的抱怨,所以测试人员改变了它到int8_t。作为一个额外的问题,<stdint.h>是C ++的一部分吗? O_O

3 个答案:

答案 0 :(得分:18)

我会说它由于其他原因未定义(而非实现定义)。

从5.8:3

  

E1 << E2的值是E1左移E2位位置;空位是零填充的。如果E1具有无符号类型,则结果的值为E1×2 E2   ,减少模数比结果类型中可表示的最大值多一个。否则,如果E1具有有符号类型和非负值,并且在结果类型中可以表示E1×2 E2 ,那么这就是结果值; 否则,行为未定义

答案 1 :(得分:7)

如果实现提供了可选的int8_t,答案应该是正确的,来自C99 draft哪些C ++ 11引用了关于stdint的内容;

  

7.18.1.1精确宽度整数类型

     

typedef名称intN_t指定带宽为N的无符号整数类型,无填充   位和二的补码表示。因此,int8_t表示有符号整数   类型,宽度恰好为8位。

答案 2 :(得分:3)

由于回答了直接问题,我将回答红利问题:<stdint.h>是C标题,可在C ++中使用。但是,请改用现代C ++标题<cstdint>