在C赋值语句中附加零意味着什么?

时间:2019-01-21 14:03:03

标签: c

我正在写信询问有关有线C语句的快速问题。在mpi / mpi-pow.c的第680行libgcrypt 1.7.3中找到以下语句。

base_u_size |= (precomp_size[k] & ((mpi_size_t)0 - (k == e0)) );

所以0之后的mpi_size_t似乎对我来说是如此。我还显示了以下汇编代码序列,与该源代码语句相对应:

              mov    -0x138(%ebp),%eax
              mov    -0x48(%ebp,%eax,4),%edx
              mov    -0x138(%ebp),%eax
              cmp    -0x114(%ebp),%eax  <----- eax = k, -0x114(%ebp) = e0
              jne    80b84b2 <_gcry_mpi_powm+0xeee>
              mov    $0xffffffff,%eax
              jmp   80b84b7 <_gcry_mpi_powm+0xef3>
     80b84b2: mov    $0x0,%eax
     80b84b7: and    %edx,%eax

因此,0在这里不会产生任何影响吗?

3 个答案:

答案 0 :(得分:3)

  

所以mpi_size_t之后的附加0

它称为type-casting

根据定义,整数常量值为int类型。要制作的类型明确为mpi_size_t,则将值强制转换为所需的类型。

答案 1 :(得分:1)

0之后的mpi_size_t用于将其(0)类型转换为类型mpi_size_t

答案 2 :(得分:1)

  

在C赋值语句中附加零意味着什么?

base_u_size |= (precomp_size[k] & ((mpi_size_t)0 - (k == e0)) );

同样,@Sourav Ghosh也会将0强制转换为mpi_size_t


要回答为什么代码执行强制转换?

mpi/mpi-pow.c中,base_u_size的类型为mpi_size_t
为了确保分配的右侧至少使用 mpi_size_t数学的等级和宽度以及混合有符号类型的安静警告。

通过在右侧包括mpi_size_t,减法和&使用的宽度不会丢失信息。

由于涉及的对象类型为here(我没有确切地使用OP),所以这里可能没有什么区别。 base_u_size |= precomp_size[k] & -(k == e0);很好-但会发出顽强的警告。

OP的代码是一个常见的习惯用法(至少要像左尺寸那样做右手数学运算,并争取相同的符号),以防止出现问题。