| Thread overview | ||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
October 06, 2015 Bug? 0 is less than -10 | ||||
|---|---|---|---|---|
| ||||
Maybe I am just too stressed out to see the problem.
[code]
import std.stdio;
void main(){
size_t dec = 0;
writeln( dec, " ", (dec <= -10), " ", (dec >= 10), " ", ((dec <= -10) || (dec >= 10)) );
}
[/code]
[output]
0 true false true
[/output]
How is it generating "true" for (dec <= -10) ? Is there a special casting or something?
DMD 2.068.2, Ubuntu 64-bit
| ||||
October 06, 2015 Re: Bug? 0 is less than -10 | ||||
|---|---|---|---|---|
| ||||
Posted in reply to tcak | On Tuesday, 6 October 2015 at 14:46:56 UTC, tcak wrote: > void main(){ > size_t dec = 0; > How is it generating "true" for (dec <= -10) ? Is there a special casting or something? size_t is unsigned, so the -10 is cast to unsigned too for the comparison which yields some huge number. Comparing signed to unsigned is almost always a mistake... but one D inherited from C. This is a reason why I prefer to use int instead of size_t where I can but that might require casts and truncation too. | |||
October 06, 2015 Re: Bug? 0 is less than -10 | ||||
|---|---|---|---|---|
| ||||
Posted in reply to tcak | On Tuesday, 6 October 2015 at 14:46:56 UTC, tcak wrote:
> Maybe I am just too stressed out to see the problem.
>
> [code]
> import std.stdio;
>
> void main(){
> size_t dec = 0;
>
> writeln( dec, " ", (dec <= -10), " ", (dec >= 10), " ", ((dec <= -10) || (dec >= 10)) );
> }
> [/code]
>
> [output]
> 0 true false true
> [/output]
>
> How is it generating "true" for (dec <= -10) ? Is there a special casting or something?
>
> DMD 2.068.2, Ubuntu 64-bit
dec is a size_t. size_t is unsigned. -10 is cast to unsigned for the comparison, resulting in some huge value.
| |||
October 06, 2015 Re: Bug? 0 is less than -10 | ||||
|---|---|---|---|---|
| ||||
Posted in reply to tcak | On Tuesday, 6 October 2015 at 14:46:56 UTC, tcak wrote: > Maybe I am just too stressed out to see the problem. > > [code] > import std.stdio; > > void main(){ > size_t dec = 0; > > writeln( dec, " ", (dec <= -10), " ", (dec >= 10), " ", ((dec <= -10) || (dec >= 10)) ); > } > [/code] > > [output] > 0 true false true > [/output] > > How is it generating "true" for (dec <= -10) ? Is there a special casting or something? > > DMD 2.068.2, Ubuntu 64-bit If you need to mix signed and unsigned values but want to avoid this issue, you an use the comparison functions from std.functional. http://dlang.org/phobos/std_functional.html#.lessThan | |||
October 06, 2015 Re: Bug? 0 is less than -10 | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Adam D. Ruppe | On Tuesday, 6 October 2015 at 14:55:23 UTC, Adam D. Ruppe wrote:
> On Tuesday, 6 October 2015 at 14:46:56 UTC, tcak wrote:
>> void main(){
>> size_t dec = 0;
>
>> How is it generating "true" for (dec <= -10) ? Is there a special casting or something?
>
> size_t is unsigned, so the -10 is cast to unsigned too for the comparison which yields some huge number.
>
> Comparing signed to unsigned is almost always a mistake... but one D inherited from C.
>
> This is a reason why I prefer to use int instead of size_t where I can but that might require casts and truncation too.
could we have ssize_t defined in phobos somewhere so your code ends up being portable ;) (It's trivial to do, obviously).
| |||
October 07, 2015 Re: Bug? 0 is less than -10 | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Laeeth Isharc | On 10/6/15 7:21 PM, Laeeth Isharc wrote:
> could we have ssize_t defined in phobos somewhere so your code ends up
> being portable ;) (It's trivial to do, obviously).
ptrdiff_t
-Steve
| |||
October 07, 2015 Re: Bug? 0 is less than -10 | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | On Wednesday, 7 October 2015 at 02:53:32 UTC, Steven Schveighoffer wrote:
> On 10/6/15 7:21 PM, Laeeth Isharc wrote:
>> could we have ssize_t defined in phobos somewhere so your code ends up
>> being portable ;) (It's trivial to do, obviously).
>
> ptrdiff_t
>
> -Steve
It seems unnatural to use such a name when the variable has nothing to do with pointers - it doesn't contribute to the readability. Yes, it's trivial, but small things cumulatively matter. Adam tends to use int and when that gets mixed up with an auto size_t (eg via length) then his code doesn't compile on 64 bit. And if it happens with his code, you can imagine this isn't a problem that inexperienced users never encounter.
| |||
October 07, 2015 Re: Bug? 0 is less than -10 | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Laeeth Isharc | On Wednesday, 7 October 2015 at 05:27:12 UTC, Laeeth Isharc wrote:
> On Wednesday, 7 October 2015 at 02:53:32 UTC, Steven Schveighoffer wrote:
>> On 10/6/15 7:21 PM, Laeeth Isharc wrote:
>>> could we have ssize_t defined in phobos somewhere so your code ends up
>>> being portable ;) (It's trivial to do, obviously).
>>
>> ptrdiff_t
>>
>> -Steve
>
> It seems unnatural to use such a name when the variable has nothing to do with pointers - it doesn't contribute to the readability. Yes, it's trivial, but small things cumulatively matter. Adam tends to use int and when that gets mixed up with an auto size_t (eg via length) then his code doesn't compile on 64 bit. And if it happens with his code, you can imagine this isn't a problem that inexperienced users never encounter.
IMO it seems unnatural to use size_t with a signed/negative value too.
| |||
October 07, 2015 Re: Bug? 0 is less than -10 | ||||
|---|---|---|---|---|
| ||||
Posted in reply to Andrea Fontana | On Wednesday, 7 October 2015 at 07:38:44 UTC, Andrea Fontana wrote:
> On Wednesday, 7 October 2015 at 05:27:12 UTC, Laeeth Isharc wrote:
>> On Wednesday, 7 October 2015 at 02:53:32 UTC, Steven Schveighoffer wrote:
>>> On 10/6/15 7:21 PM, Laeeth Isharc wrote:
>>>> could we have ssize_t defined in phobos somewhere so your code ends up
>>>> being portable ;) (It's trivial to do, obviously).
>>>
>>> ptrdiff_t
>>>
>>> -Steve
>>
>> It seems unnatural to use such a name when the variable has nothing to do with pointers - it doesn't contribute to the readability. Yes, it's trivial, but small things cumulatively matter. Adam tends to use int and when that gets mixed up with an auto size_t (eg via length) then his code doesn't compile on 64 bit. And if it happens with his code, you can imagine this isn't a problem that inexperienced users never encounter.
>
> IMO it seems unnatural to use size_t with a signed/negative value too.
Indeed. But you end up with an inferred size_t in a foreach and using length with auto, so it makes sense to have something nicer that you can specify that won't make your code look strange. Doesn't bother me since I define ssize_t, but it might make D easier to read for others. When you see ptrdiff_t with no pointer in sight it's not very clear unless you are familiar with C idioms (and I never remember seeing this back when I learnt C - some modern thing).
| |||
October 07, 2015 Re: Bug? 0 is less than -10 | ||||
|---|---|---|---|---|
| ||||
Posted in reply to tcak | On Tuesday, 6 October 2015 at 14:46:56 UTC, tcak wrote: > Maybe I am just too stressed out to see the problem. > > [code] > import std.stdio; > > void main(){ > size_t dec = 0; > > writeln( dec, " ", (dec <= -10), " ", (dec >= 10), " ", ((dec <= -10) || (dec >= 10)) ); > } > [/code] > > [output] > 0 true false true > [/output] > > How is it generating "true" for (dec <= -10) ? Is there a special casting or something? > > DMD 2.068.2, Ubuntu 64-bit Lionello Lunesu posted a PR that should fix this: https://github.com/D-Programming-Language/dmd/pull/1913 See also the discussion in the linked bug report. Unfortunately it seems it's been forgotten since then... | |||
Copyright © 1999-2021 by the D Language Foundation
Permalink
Reply