我正在写信询问有关有线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
在这里不会产生任何影响吗?
答案 0 :(得分:3)
答案 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的代码是一个常见的习惯用法(至少要像左尺寸那样做右手数学运算,并争取相同的符号),以防止出现问题。