C++ C++;:按变量值而不是数字移位->;有什么区别? int值=0xFFFFFF; int len=32; int result=value
如果C++ C++;:按变量值而不是数字移位->;有什么区别? int值=0xFFFFFF; int len=32; int result=value,c++,c,C++,C,如果len>=sizeof(int)或len
len>=sizeof(int)
或len<0
,则代码包含未定义的行为
有关更多详细信息,请参阅答案。如果
int
的大小小于等于32位,则代码包含
未定义的行为。位数
移位必须大于或等于0,并且严格小于
正在移位的内容中的位数
实际上可能发生的是,对于变量,
编译器可能只是将其传递给计算机
只考虑5个低阶位的指令
如果是32,则为0);当移位计数为常量时
编译器在内部计算表达式,可能是long
long
,然后将其截断。但这只是一种可能
行为;就语言而言,任何事情都可能发生
担心 你在用什么编译器?问题可能是由于值是有符号的,但不确定。我得到的结果都是零:@Ryzehvost没有理由不期望编译器之间存在差异,因为除非
int
大于32位,否则行为是未定义的。重新编辑:未定义的行为是未定义的,所以没有什么应该让你感到惊讶。@James,你是对的。它是未定义的,因为int是有符号的。@Ryzhehvost有符号性是不相关的。(当符号性在右移时发挥作用,它不会引入未定义的行为,只是实现定义的行为。)这就是我想要的,也是我期望的,但事实上它们都是0xFFFFFF(VS2010)。代码有未定义的行为,所以你不能对结果说任何话。@JamesKanze你能在这方面启发我吗?@RikayanBandyopadhyay看到我的回答了。将32位整数移位32位或更多位是未定义的行为。James在这里是正确的,如果移位量为负或大于或等于升级类型的位计数,则移位是未定义的,请参阅中的引号。好的,这将证明为什么ideone.com说0而VS2010说0-1@user3249723相当地(虽然未定义,但我怀疑大多数具有32位整数的编译器都会给出这两个结果中的一个。)@presiuslitelsnoflek我一直在填写答案:-)。我已经纠正了你现在所做的。我可能无意中点击了
,它重复了编辑器中的最后一个命令(最后一个命令是插入第一句话)。
int value = 0xffffffff;
int len = 32;
int result = value << len; // result will be 0xffffffff
result = value << 32; // result will be 0x0
unsigned int value = 0xffffffff;
unsigned int len = 32;
printf("0x%x\n", value << len); //will print 0xffffffff
printf("0x%x\n", 0xffffffff << 32); //will print 0x0