赋值中涉及二进制运算时,编译器如何处理自动变量

时间:2019-01-09 10:38:27

标签: c

我想知道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 <<上。

2 个答案:

答案 0 :(得分:1)

让我们逐步介绍表达式a = 1<<3

  1. 这是一个简单的赋值语句,其中应评估lvalue。因此1 << 3将被评估为8。由于13都是整数文字,并且编译器可能会生成类似于ROL 1,3的汇编指令->将1左移8,然后将结果存储在累加器中。

    <<的优先级高于=

  2. 到现在为止,我们还不知道我们需要在何处存储上述步骤的结果。 正如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.

然后按预期工作。