[fpc-devel] Do bitwise operation (1 or 2) acre about the sign ? (Giving sign related hints on compilation)

Martin lazarus at mfriebe.de
Mon Jan 14 17:03:53 CET 2013


On 14/01/2013 15:52, Jonas Maebe wrote:
>
> On 14 Jan 2013, at 16:44, Martin wrote:
>
>> This is casting a "set of bits" (neither signed, nor unsigned - a set 
>> is not a number at all) into a number. This only needs to have a 
>> definition, if it should cast to signed or unsigned type.
>
> It has to be signed, because otherwise any negative number in the 
> operation would trigger a range check error when it gets converted to 
> a (larger) unsigned type. The nature of the operation that is used 
> afterwards is irrelevant, range checking always operates in exactly 
> the same way when performing a type conversion from one type to 
> another. This is required to have predictable behaviour in a 
> programming language.
>

not sure if I follow. If "or" performs on a "set of bits" (rather than a 
number), and a set (not being a number) is neither signed or unsigned, 
then before the "OR" both operands (independent of being signed or not) 
will be cast to a set. The result is a set. The set can be converted to 
either signed or unsigned. The set has no range checking.

   result := bit_set32(a) or bit_set32(b)

If result has also 32 (or more) bits, then no range check error can 
occur. In the set, the high-bit has no meaning. It is neither part of 
the (unsigned positive) numer, nor is it sign indicator. This meaning is 
only applied by casting it to a numeric type.

Same as
var i: set of (b0, b1, b2 .... b31);
signed := integer(i);
unsigned := cardinal(i);


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freepascal.org/pipermail/fpc-devel/attachments/20130114/acda768e/attachment.html>


More information about the fpc-devel mailing list