c++测试-符号位1总是表示负的吗?
C++ Test - Does sign bit 1 always mean negative?
我刚刚参加了一个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>
。
相关文章:
- 表示"accepting anything for this template argument" C++概念的通配符
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将ampl中的集合表示为c++中的向量
- 尽管测试成功,CppUnit测试核心仍被丢弃.为什么
- std::is_base_of表示ctor编译错误
- 数据成员SFINAE的C++17测试:gcc vs clang
- 输入中的字符串数未知(以字母表示)
- 我可以信任表示整数的浮点或双精度来保持精度吗
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么二进制搜索在我的测试中不起作用
- 从父数组测试用例构造二叉树失败
- 试图对缓存进行跨步测试,但程序并没有结束
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- OpenGL在启用深度测试时不会丢弃我的碎片
- 为测试目标创建具有不同源文件夹的文件
- 尝试在此测试分数程序上使用指针表示法而不是数组表示法,但我被困住了
- c++测试-符号位1总是表示负的吗?
- 测试字符串是否表示"yyyy-mm-dd"
- 如何测试文件存储的浮点表示