Integer conversions too pedantic in 64-bit
Don
nospam at nospam.com
Wed Feb 16 03:21:06 PST 2011
spir wrote:
> On 02/16/2011 03:07 AM, Jonathan M Davis wrote:
>> On Tuesday, February 15, 2011 15:13:33 spir wrote:
>>> On 02/15/2011 11:24 PM, Jonathan M Davis wrote:
>>>> Is there some low level reason why size_t should be signed or something
>>>> I'm completely missing?
>>>
>>> My personal issue with unsigned ints in general as implemented in C-like
>>> languages is that the range of non-negative signed integers is half
>>> of the
>>> range of corresponding unsigned integers (for same size).
>>> * practically: known issues, and bugs if not checked by the language
>>> * conceptually: contradicts the "obvious" idea that unsigned (aka
>>> naturals)
>>> is a subset of signed (aka integers)
>>
>> It's inevitable in any systems language. What are you going to do,
>> throw away a
>> bit for unsigned integers? That's not acceptable for a systems
>> language. On some
>> level, you must live with the fact that you're running code on a
>> specific machine
>> with a specific set of constraints. Trying to do otherwise will pretty
>> much
>> always harm efficiency. True, there are common bugs that might be better
>> prevented, but part of it ultimately comes down to the programmer
>> having some
>> clue as to what they're doing. On some level, we want to prevent
>> common bugs,
>> but the programmer can't have their hand held all the time either.
>
> I cannot prove it, but I really think you're wrong on that.
>
> First, the question of 1 bit. Think at this -- speaking of 64 bit size:
> * 99.999% of all uses of unsigned fit under 2^63
> * To benefit from the last bit, you must have the need to store a value
> 2^63 <= v < 2^64
> * Not only this, you must step on a case where /any/ possible value for
> v (depending on execution data) could be >= 2^63, but /all/ possible
> values for v are guaranteed < 2^64
> This can only be a very small fraction of cases where your value does
> not fit in 63 bits, don't you think. Has it ever happened to you (even
> in 32 bits)? Something like: "what a luck! this value would not (always)
> fit in 31 bits, but (due to this constraint), I can be sure it will fit
> in 32 bits (always, whatever input data it depends on).
> In fact, n bits do the job because (1) nearly all unsigned values are
> very small (2) the size used at a time covers the memory range at the
> same time.
>
> Upon efficiency, if unsigned is not a subset of signed, then at a low
> level you may be forced to add checks in numerous utility routines, the
> kind constantly used, everywhere one type may play with the other. I'm
> not sure where the gain is.
> Upon correctness, intuitively I guess (just a wild guess indeed) if
> unigned values form a subset of signed ones programmers will more easily
> reason correctly about them.
>
> Now, I perfectly understand the "sacrifice" of one bit sounds like a
> sacrilege ;-)
> (*)
>
> Denis
>
> (*) But you know, when as a young guy you have coded for 8 & 16-bit
> machines, having 63 or 64...
Exactly. It is NOT the same as the 8 & 16 bit case. The thing is, the
fraction of cases where the MSB is important has been decreasing
*exponentially* from the 8-bit days. It really was necessary to use the
entire address space (or even more, in the case of segmented
architecture on the 286![1]) to measure the size of anything. D only
supports 32 bit and higher, so it isn't hamstrung in the way that C is.
Yes, there are still cases where you need every bit. But they are very,
very exceptional -- rare enough that I think the type could be called
__uint, __ulong.
[1] What was size_t on the 286 ?
Note that in the small memory model (all pointers 16 bits) it really was
possible to have an object of size 0xFFFF_FFFF, because the code was in
a different address space.
More information about the Digitalmars-d
mailing list