Created
December 18, 2021 15:43
-
-
Save matu3ba/1c8c033c07fb96d926b9baf0ac00e84a to your computer and use it in GitHub Desktop.
wrappign negation: print hex with casting to unsigned does not work
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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