Michael Heidelberg Michael Heidelberg - 10 months ago 33
C Question

Why casting twice in this line?

I've already read some Q&A concerning questions similar to mine, but I am still not sure if my case is the same as those questions.

I am wondering why we need two casts here:


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

typedef unsigned long ULONG;

typedef unsigned short USHORT;

C library used: FLINT

Book: Cryptogtaphy in C and C++


Trying to take OP's code piece by piece.

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

This is somewhat simplified to

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

Given the range of ULONG >= range of USHORT and likely is greater than ...

(USHORT)(carry >> BITPERDGT) simple shifts the value of carry the least BITPERDGT significant bits out. The remaining are cast with (USHORT) result in the most significant bits being zeroed.

Then code casts unnecessarily to ULONG with (ULONG)(USHORT)(carry >> BITPERDGT));. It is not needed as the subsequent addition with a ULONG will cause (USHORT)(carry >> BITPERDGT to be promoted to ULONG even without the cast.

Why casting twice in this line?

Although not needed, the (ULONG) cast may exist to emphasize to programmers that the result of (USHORT)(carry >> BITPERDGT)) is promoted before the addition.