2013-03-24 72 views
4

我有一个int8_t,我想看看会发生什么,如果我把它移到比8位更远的地方。所以这就是我所做的:为什么移位超过允许位仍然有效?

int8_t x = 1; 

std::cout << (x << 10); 

由于某种原因,这返回1024就好像类型包含足够的位来表示该数字。我认为,当你移动超过给定的位时,你会在所有位中得到0(或者导致未定义行为的有符号溢出/下溢)。此外,我跑这个代码给我的int8_t最大数量:

std::numeric_limits<int8_t>::max(); // 127 

这种类型的最大数量为127个,但换挡它留下可以让它甚至比去的无符号类型更高!这怎么可能?

回答

9

<<的参数正被隐含地扩大为int,并且x << 10的结果也是int

+0

我怎样才能把它保留到'int8_t'? – user2030677 2013-03-24 15:08:37

+1

@ user2030677你不能。如果需要,您可以在轮班后施放结果。然后您将实现定义的超出范围值转换为有符号整数类型。 – 2013-03-24 15:10:01

+0

@DanielFischer和NPE:假设如果我换成:'int8_t y = 10; std :: cout <<(x << y);'那么它将返回int **?**或输出将是'0' – 2013-03-24 15:10:47

相关问题