【发布时间】:2015-08-09 00:53:14
【问题描述】:
我有一个简单的程序。 请注意,我使用了一个大小为 1 字节的无符号固定宽度整数。
#include <cstdint>
#include <iostream>
#include <limits>
int main()
{
uint8_t x = 12;
std::cout << (x << 1) << '\n';
std::cout << ~x;
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cin.get();
return 0;
}
我的输出如下。
24
-13
我测试了更大的数字,操作员 << 总是给我正数,而操作员 ~ 总是给我负数。然后我用sizeof() 发现...
当我使用左移位运算符 (
<<) 时,我收到一个无符号的 4 字节整数。当我使用按位非运算符 (
~) 时,我收到一个带符号的 4 字节整数。
似乎按位非运算符(~)像算术运算符一样进行有符号整数提升。但是,左移运算符(<<)似乎提升为无符号积分。
我觉得有义务知道编译器何时在我背后改变了某些东西。如果我的分析是正确的,所有按位运算符是否都提升为 4 字节整数?为什么有些签名有些未签名?我很困惑!
编辑:我关于总是得到正值或总是得到负值的假设是错误的。但是,由于以下出色的答案,我了解了真正发生的事情。
【问题讨论】:
-
如何让流将
uint8_t输出为数字而不是字符?你确定你的编译器没有将该类型别名为int? -
@AntonSamsonov 在下面的答案中,他解释说这是在按位运算发生后发生的积分提升的结果。换句话说,数据类型从
uint8_t提升为int。
标签: c++ bitwise-operators unsigned-integer integer-promotion signed-integer