What's the deal with negative numbers?

This is a discussion / support forum for the Hugo programming language by Kent Tessman. Hugo is a powerful programming language for making text games / interactive fiction with multimedia support.

Hugo download links: https://www.generalcoffee.com/hugo
Roody Yogurt's Hugo Blog: https://notdeadhugo.blogspot.com
The Hugor interpreter by RealNC: http://ifwiki.org/index.php/Hugor

Moderators: Ice Cream Jonsey, joltcountry

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

What's the deal with negative numbers?

Post by RealNC »

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: 2179
Joined: Mon Apr 29, 2002 6:23 pm
Location: Milwaukee

Post by Roody_Yogurt »

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: 2244
Joined: Wed Mar 07, 2012 4:32 am

Post by RealNC »

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: 2179
Joined: Mon Apr 29, 2002 6:23 pm
Location: Milwaukee

Post by Roody_Yogurt »

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: 2244
Joined: Wed Mar 07, 2012 4:32 am

Post by RealNC »

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