2016-09-20 33 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庫使用:FLINT

書:Cryptogtaphy用C和C++

+2

因爲在密碼學中,你想要不可讀,混淆,**神祕的**代碼。 – Amit

+1

它會有效地將任何大於ushort的「高」位清零 –

+0

因爲我們希望USHORT掩碼的值過大,但那很骯髒。面具會好很多。 –

回答

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()參數具有相應字段說明符的正確類型,或者擴大該值以適應其高位的旋轉。