Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;:按变量值而不是数字移位->;有什么区别? int值=0xFFFFFF; int len=32; int result=value_C++_C - Fatal编程技术网

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