Что означает добавление нуля в операторе присваивания Си? - PullRequest
0 голосов
/ 21 января 2019

Я пишу, чтобы спросить быстрый вопрос о проводном операторе Си.Следующее утверждение находится в libgcrypt 1.7.3, строка 680 в mpi / mpi-pow.c.

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 голосов
/ 21 января 2019

0 после mpi_size_t предназначен для его типизации (0) к типу mpi_size_t

0 голосов
/ 21 января 2019

Что означает добавляемый ноль в операторе присваивания 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 вправая сторона, вычитание и & используют ширину, которая не теряет информацию.

С типами объектов, таких как здесь (у меня нет точно, что такое OPиспользуя), это, вероятно, не имеет никакого значения здесь.base_u_size |= precomp_size[k] & -(k == e0); было бы хорошо - но вырасти привередливые предупреждения.

Код OP является распространенной идиомой (делайте правую математику, по крайней мере, такую ​​же ширину, как левый размер, и стремитесь к той же значимости), чтобы избежать проблем.

0 голосов
/ 21 января 2019

Итак, добавление 0 после mpi_size_t

Это называется приведение типа .

По определению целочисленные константы имеют тип int. Чтобы сделать явно тип mpi_size_t, вы приведете значение к требуемому типу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...