我想知道Compile(或语言)是否对待不同的变量,例如:
auto unsigned int a;
a = 8;
来自:
auto unsigned int a;
a = 1 << 3;
更精确地说,这里a = 8
的{{1}}处将被写入值a
,因此,不存在哪个值(即使存在垃圾也没有意义) )。
我不确定在这种情况下8
到底如何工作。
我确定在a = 1 << 3
内有一个垃圾值,例如,如果a
(一个垃圾值),那么a == 1341
会得到a = 1 << 3
。 / p>
但是如果8
以二进制表示表示:
1341
当时我期望成为00000101 00111101
:
10728
。
我在这里不确定的是,00101001 11101000
被视为a
吗?
以这种形式将00000000
初始化为a
,然后执行左侧的操作?
像0
一样?
00000000 = 1 << 3
变成a
的地方,或者在这种情况下如何真正起作用?
我确实了解0000 1000
,然后unsigned int a = 0
就是a = a << 3
,但这与我的问题不同,因为在这里8 = 0000 1000
上的操作是{{1} },而不是像我的问题中那样在a <<
上。
答案 0 :(得分:1)
让我们逐步介绍表达式a = 1<<3
这是一个简单的赋值语句,其中应评估lvalue
。因此1 << 3
将被评估为8
。由于1
和3
都是整数文字,并且编译器可能会生成类似于ROL 1,3
的汇编指令->将1左移8,然后将结果存储在累加器中。
<<
的优先级高于=
。
到现在为止,我们还不知道我们需要在何处存储上述步骤的结果。
正如a
一样,自动变量编译器可能会决定将其存储在stack
段中。伪
指令可以是MOV @SP+4, A
->将累加器的数据移到某个位置
由偏移量为4的堆栈指针指向。
正如您所说的那样,a
最初将具有垃圾值。但这不会影响第二条语句。
P.S:所有组装说明都将针对特定平台,以上步骤仅作为示例。
编辑
正如伦丁1<<3
所指出的那样,它是整数常量表达式,因此它将评估编译时间。因此,我们可能只需要执行一个运行时步骤,即可将8
复制到堆栈中。
答案 1 :(得分:0)
http://localhost:3000/clients/products?utf8=%E2%9C%93&query%5Bkeyword%5D=jean&commit=Valider
如果要设置第8个位掩码,则必须这样:
auto unsigned int a; //a is garbage value yet
a = 1 << 8; // a assign 1<<8(256) to a. a will be 1 << 8.
然后按预期工作。