Signed word lengths and indexes
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Wed Jun 16 12:49:44 PDT 2010
Jérôme M. Berger wrote:
> Jérôme M. Berger wrote:
>> Walter Bright wrote:
>>> Jérôme M. Berger wrote:
>>>> Actually, that problem already occurs in C. I've had problems when
>>>> porting code from x86 to x86_64 because some unsigned operations
>>>> don't behave the same way on both...
>>> How so? I thought most 64 bit C compilers were specifically designed to
>>> avoid this problem.
>> I can't isolate it to a minimal test case, but at my job, we make
>> an image processing library. Since negative image dimensions don't
>> make sense, we decided to define width and height as "unsigned int".
>> Now, we have code that works fine on 32-bit platforms (x86 and arm)
>> but segfaults on x86_64. Simply adding an (int) cast in front of the
>> image dimensions in a couple of places fixes the issue (tested with
>> various versions of gcc on linux and windows).
>>
> Gotcha! See the attached test case. I will post the explanation for
> the issue as a reply to give everyone a chance to try and spot the
> error...
>
> Jerome
>
Whoa! That's indeed unfortunate. Allow me some more whoring for TDPL:
==============
\indexes{surprising behavior!of unary \lstinline{-}}%
One surprising behavior of unary minus is that, when applied to an
unsigned value, it still yields an unsigned value (according to the
rules in~\S~\vref{sec:typing-of-ops}). For example,\sbs @-55u@ is\sbs
@4_294_967_241@, which is\sbs \ccbox{uint.max - 55 + 1}.
\indexes{unsigned type, natural number, two's complement, overflow}%
The fact that unsigned types are not really natural numbers is a fact
of life. In\sbs\dee and many other languages, two's complement
arithmetic with its simple overflow rules is an inescapable reality
that cannot be abstracted away. One way to think \mbox{of} @-val@ for
any integral value~@val@ is to consider it a short form \mbox{of}$\,$
\cc{\~val + 1}; in other words, flip every bit in @val@ and then add
@1@ to the result. This manipulation does not raise particular
questions about the signedness of~@val at .
==============
(This heavily adorned text also shows what sausage making looks like...)
Andrei
More information about the Digitalmars-d
mailing list