What's the deal with negative numbers?

Hugo programming discussion. http://www.generalcoffee.com/hugo
Hugo By Example: http://hugo.gerynarsabode.org/index.php?title=Main_Page
Roody Yogurt's Hugo Blog: http://notdeadhugo.blogspot.com

Moderators: Ice Cream Jonsey, AArdvark, Kent

Post Reply
User avatar
RealNC
Posts: 1066
Joined: Wed Mar 07, 2012 4:32 am

What's the deal with negative numbers?

Post by RealNC » Sat Mar 19, 2016 12:17 pm

I'm getting weirdness when writing negative numbers to disk:

Code: Select all

writefile "test" {
    writeval (-1)
    writeval (-2)
}

readfile "test" {
    print number readval number readval
}
I'm getting 255 and 254 as output.

Can you guys please test on the official terp? Do you get the same result?

Roody_Yogurt
Posts: 1993
Joined: Mon Apr 29, 2002 6:23 pm
Location: Milwaukee

Post by Roody_Yogurt » Tue Mar 22, 2016 6:09 am

Whoops, I didn't see this thread, but yes, I can verify it gives those values with the official terp, too.

User avatar
RealNC
Posts: 1066
Joined: Wed Mar 07, 2012 4:32 am

Post by RealNC » Tue Mar 22, 2016 8:31 am

Thanks. Good to know it's not just me. This is obviously going to affect opcodes that take negative values, so it needs fixing at some point.

Roody_Yogurt
Posts: 1993
Joined: Mon Apr 29, 2002 6:23 pm
Location: Milwaukee

Post by Roody_Yogurt » Tue Mar 22, 2016 8:37 am

I'm sure you already know all this, but here's what the manual says about negative numbers:
VALUE (i.e., INTEGER CONSTANT):
<value> <2>
A value may range from -32768 to 32767; negative numbers follow signed-value
16-bit convention by being x + 65536 where x is a negative number.
For example, the values 10 ($0A), 16384 ($4000), and -2 would be written
as:
$4B 0A 00
$4B 00 40
$4B FE FF ($FFFE = 65534 = -2 + 65536)
Does writing to file use a different type of encoding so something is lost in translation?

(I have no idea how any of this works)

User avatar
RealNC
Posts: 1066
Joined: Wed Mar 07, 2012 4:32 am

Post by RealNC » Tue Mar 22, 2016 8:59 am

The issue is that what actually happens when writing numbers to a file doesn't follow that description, as is apparent when trying to read the value back. You get something different than what you wrote.

The engine writes two bytes per value to files, in little-endian format. Except that for negative numbers between -1 and -255 it writes the same bytes as for the positive numbers between 255 and 1.

"writeval (-1)" writes "FF 00". "writeval 255" also writes "FF 00".

Looks like a bug.

Post Reply