Apparently unsigned types really are necessary
foobar
foo at bar.com
Sun Jan 22 12:36:33 PST 2012
On Sunday, 22 January 2012 at 20:01:52 UTC, bcs wrote:
> On 01/22/2012 01:31 AM, Marco Leise wrote:
>> Am 22.01.2012, 08:23 Uhr, schrieb bcs <bcs at example.com>:
>>
>>> On 01/21/2012 10:05 PM, Walter Bright wrote:
>>>> http://news.ycombinator.com/item?id=3495283
>>>>
>>>> and getting rid of unsigned types is not the solution to
>>>> signed/unsigned
>>>> issues.
>>>
>>> A quote from that link:
>>>
>>> "There are many use cases for data types that behave like
>>> pure bit
>>> strings with no concept of sign."
>>>
>>> Why not recast the concept of unsigned integers as "bit
>>> vectors (that
>>> happen to implement arithmetic)"? I've seen several sources
>>> claim that
>>> uint (and friends) should never be used unless you are using
>>> it for
>>> low level bit tricks and the like.
>>
>> Those are heretics.
>>
>>> Rename them bits{8,16,32,64} and make the current names
>>> aliases.
>>
>> So everyone uses int, and we get messages like: "This program
>> currently
>> uses -1404024 bytes of RAM". I have strong feelings against
>> using signed
>> types for variables that are ever going to only hold positive
>> numbers,
>> especially when it comes to sizes and lengths.
>
> OK, I'll grant that there are a (*extremely* limited) number of
> cases where you actually need the full range of an unsigned
> integers type. I'm not suggesting that the actual semantics of
> the type be modified and it would still be usable for exactly
> that sort of cases. My suggestion is that the naming be
> modified to avoid suggesting that the *primary* use for the
> type is for non negative numbers.
>
> To support that position, if you really expect to encounter and
> thus need to correctly handle numbers between 2^31 and 2^32 (or
> 63/64, etc.) then you already need to be doing careful analyses
> to avoid bugs from overflow. At that point, you are already
> considering low level details and using a "bit vector" type as
> a number is not much more complicated. The added bonus is that
> the mismatch between the name and what it's used for is a big
> red flag saying "be careful or this is likely to cause bugs".
>
> Getting people to think of it that way is likely to prevent
> more bugs that it cause.
I think that we're looking in the wrong corner for the culprit.
While the unsigned types could have had better names (machine
related: byte, word, etc..) IMO the real issue here is *not*
with the types themselves but rather with the horrid implicit
conversion rules inherited from C. mixed signed/unsigned
expressions really should be compile errors and should be
resolved explicitly by the programmer. foo() + bar() can be any
of int/uint/long depending on what the programmer wants to
achieve.
my 2 cents.
More information about the Digitalmars-d
mailing list