我刚刚接受了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;
}
有以下答案可供选择
“正确的”答案是7.如果答案中有“实施定义的行为”,我会选择,所以我选择了最接近的未定义行为。据我所知,在符号和替换中,1的补码和2的补码答案将是7.但是C ++标准理论上是否允许任何其他数字表示?例如,符号和幅度,但0表示否定?
我是否正确,这个问题的真正正确答案应该是实施定义的行为,如果没有,你可以解释为什么答案是7而不管实施情况如何?
我阅读了问题的评论,看来最初a
的类型是char,这显然引发了很多关于char
是否签名的抱怨,所以测试人员改变了它到int8_t。作为一个额外的问题,<stdint.h>
是C ++的一部分吗? O_O
答案 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>
。