Skip to content

Instantly share code, notes, and snippets.

@matu3ba
Created December 18, 2021 15:43
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save matu3ba/1c8c033c07fb96d926b9baf0ac00e84a to your computer and use it in GitHub Desktop.
Save matu3ba/1c8c033c07fb96d926b9baf0ac00e84a to your computer and use it in GitHub Desktop.
wrappign negation: print hex with casting to unsigned does not work
const debug = @import("std").debug;
fn printRes(comptime ST: type, a: ST, b: ST) !void {
const UT = switch (ST) {
i2 => u2,
i32 => u32,
i64 => u64,
i128 => u128,
else => unreachable,
};
var sum: ST = a -% b;
debug.print("{d} - {d}, signed wrappign({d}): {d}\n", .{ a, b, ST, sum });
const N: UT = @bitSizeOf(ST);
const min: ST = @bitCast(ST, (@as(UT, 1) << (N - 1)));
const opssamesign: ST = ~(a ^ b);
const sumdiffsign: ST = (a ^ @bitCast(ST, sum));
const opssamprint = @bitCast(UT, opssamesign);
const sumdiffprint = @bitCast(UT, sumdiffsign);
const minprint = @bitCast(UT, min);
debug.print("{x} (sum)\n{x} (operands same)\n{x} (sum different sign)\n{x} (min)\n", .{ sum, opssamprint, sumdiffprint, minprint });
}
pub fn main() !void {
const ST = i2;
var a: ST = -2;
var b: ST = -2;
try printRes(ST, a, b);
b = -1;
try printRes(ST, a, b);
b = 0;
try printRes(ST, a, b);
b = 1;
try printRes(ST, a, b);
a = 1;
try printRes(ST, a, b);
b = -2;
try printRes(ST, a, b);
b = -1;
try printRes(ST, a, b);
b = 0;
try printRes(ST, a, b);
b = 1;
try printRes(ST, a, b);
}
Output:
-2 - -2, signed wrappign(i2): 0
0 (sum)
3 (operands same)
2 (sum different sign)
2 (min)
-2 - -1, signed wrappign(i2): -1
-1 (sum)
2 (operands same)
1 (sum different sign)
2 (min)
-2 - 0, signed wrappign(i2): -2
-2 (sum)
1 (operands same)
0 (sum different sign)
2 (min)
-2 - 1, signed wrappign(i2): 1
1 (sum)
0 (operands same)
3 (sum different sign)
2 (min)
1 - 1, signed wrappign(i2): 0
0 (sum)
3 (operands same)
1 (sum different sign)
2 (min)
1 - -2, signed wrappign(i2): -1
-1 (sum)
0 (operands same)
2 (sum different sign)
2 (min)
1 - -1, signed wrappign(i2): -2
-2 (sum)
1 (operands same)
3 (sum different sign)
2 (min)
1 - 0, signed wrappign(i2): 1
1 (sum)
2 (operands same)
0 (sum different sign)
2 (min)
1 - 1, signed wrappign(i2): 0
0 (sum)
3 (operands same)
1 (sum different sign)
2 (min)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment