c++测试-符号位1总是表示负的吗?

C++ Test - Does sign bit 1 always mean negative?

本文关键字:表示 测试 符号 c++      更新时间:2023-10-16

我刚刚参加了一个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

我认为它是未定义的(而不是实现定义的),原因不同。

从5.8:3

E1 << E2的值为E1左移E2位;空出的位是零填充的。如果E1为unsigned类型,则结果值为E1 × 2E2,比结果类型中可表示的最大值多取一个模。否则,如果E1具有带符号类型且非负值,且E1 x2 E2在结果类型中可表示,则该值为结果值;,否则为未定义

如果实现提供了可选的int8_t,那么答案应该是正确的,来自C99草案,c++ 11引用了关于stdint;

7.18.1.1精确宽度整数类型

typepedef名称intN_t指定了一个宽度为N的有符号整数类型,没有填充和一个二进制的补码表示。因此,int8_t表示有符号整数输入宽度正好为8位。

既然直接的问题已经回答了,我将回答额外的问题:<stdint.h>是c++中可用的C头文件。但是,请使用现代c++标头<cstdint>