From dddb76c4ad504022fa4f4c4f6965c08da22c387e Mon Sep 17 00:00:00 2001 From: Ben Bridle Date: Sat, 12 Apr 2025 10:19:26 +1200 Subject: Fix width checks for negative integers The width of a negative integer was previously being counted in the same way as for a positive integer, by inverting the bits to make it a positive integer and then finding the placement of the highest-order 1 bit. The actual width of a negative integer will always be one greater than this value however, because the highest-order 1 bit of an inverted negative integer will always have directly above it a significant 0 bit used as the sign bit. --- src/stages/bytecode.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/stages/bytecode.rs b/src/stages/bytecode.rs index 3618b26..e4464a1 100644 --- a/src/stages/bytecode.rs +++ b/src/stages/bytecode.rs @@ -163,7 +163,7 @@ impl BytecodeParser { } }; let value_width = match field_value.cmp(&0) { - std::cmp::Ordering::Less => (-field_value).ilog2() + 1, + std::cmp::Ordering::Less => (-field_value).ilog2() + 2, std::cmp::Ordering::Equal => 0, std::cmp::Ordering::Greater => field_value.ilog2() + 1, }; -- cgit v1.2.3-70-g09d2