2016-09-20 3 views
1

Я уже прочитал некоторые вопросы Q & A, касающиеся вопросов, подобных моим, но я все еще не уверен, что мой случай совпадает с этими вопросами.Зачем бросать два раза в этой строке?

Я задаюсь вопросом, почему нам нужны два слепки здесь: (ULONG)(USHORT)(carry >> BITPERDGT)

*sptr_l++ = (USHORT)(carry = (ULONG)*aptr_l++ 
       + (ULONG)*bptr_l++ + (ULONG)(USHORT)(carry >> BITPERDGT)); 

ULong: typedef unsigned long ULONG;

USHORT: typedef unsigned short USHORT;

C библиотека используется: ФЛИНТ

Книга: Cryptogtaphy в C и C++

+2

Потому что в криптографии вы хотите нечитаемый, запутанный, ** cryptic ** код. – Amit

+1

было бы эффективно обнулить любые «высокие» биты, которые больше, чем ushort. –

+0

Потому что мы хотим, чтобы маска USHORT была слишком большой стоимостью 'carry? Но это грязно. Маска была бы намного лучше. –

ответ

2

Пытается взять код OP по частям.

*sptr_l++ = (USHORT)(carry = (ULONG)*aptr_l++ 
       + (ULONG)*bptr_l++ + (ULONG)(USHORT)(carry >> BITPERDGT)); 

Это несколько упрощен до

carry = (ULONG)*aptr_l++ + (ULONG)*bptr_l++ + (ULONG)(USHORT)(carry >> BITPERDGT); 
*sptr_l++ = (USHORT)carry; 

Учитывая диапазон ULONG> = диапазона USHORT и вероятно больше ...

(USHORT)(carry >> BITPERDGT) простых сдвигает значение carry наименьшее количество BITPERDGT. Остальные отлиты с (USHORT), при этом самые значащие биты обнуляются.

Затем код отличает необязательно до ULONG с (ULONG)(USHORT)(carry >> BITPERDGT));. Это необязательно, так как последующее добавление с ULONG приведет к тому, что (USHORT)(carry >> BITPERDGT будет повышаться до ULONG, даже без литого.

Зачем бросать дважды в этой строке?

Хотя не нужно, то (ULONG) бросок может существовать, чтобы подчеркнуть программист, что результат (USHORT)(carry >> BITPERDGT)) способствует перед добавлением.

1

Код, как представляется, является частью подпрограммы для вычисления суммы двух больших целых чисел (с цифрами, представленными как тип USHORT == unsigned short, имеющих BITPERDGT битов значения по умолчанию). Приведение к USHORT приводит к отбрасыванию старших бит его операнда, но на самом деле, если преобразованный результат когда-либо имеет другое значение, чем операнд, тогда процедура прерывается (предположим, что я правильно определил ее).

Последующее приведение к ULONG (== unsigned long) не требуется вообще в этом контексте, как преобразование это указывает, будут выполняться в любом случае для того, чтобы вычислить сумму этого операнда с ULONG левого операнда из +. В любом случае он не влияет на значение, учитывая, что unsigned long должен иметь возможность представлять все значения, которые может представлять unsigned short. Такой литой будет только в особых контекстах, например, чтобы аргумент printf() имел правильный тип для своего соответствующего спецификатора поля или для увеличения значения для размещения вершин своих верхних бит.

Смежные вопросы