diff --git a/lib/std/fmt.zig b/lib/std/fmt.zig index 4c470d9eec..a439ecbdd6 100644 --- a/lib/std/fmt.zig +++ b/lib/std/fmt.zig @@ -943,19 +943,17 @@ fn formatIntSigned( .precision = options.precision, .fill = options.fill, }; - - const uint = std.meta.IntType(false, @TypeOf(value).bit_count); + const bit_count = @typeInfo(@TypeOf(value)).Int.bits; + const Uint = std.meta.IntType(false, bit_count); if (value < 0) { - const minus_sign: u8 = '-'; - try output(context, @as(*const [1]u8, &minus_sign)[0..]); - const new_value = @intCast(uint, -(value + 1)) + 1; + try output(context, "-"); + const new_value = ~@bitCast(Uint, value +% -1); return formatIntUnsigned(new_value, base, uppercase, new_options, context, Errors, output); } else if (options.width == null or options.width.? == 0) { - return formatIntUnsigned(@intCast(uint, value), base, uppercase, options, context, Errors, output); + return formatIntUnsigned(@intCast(Uint, value), base, uppercase, options, context, Errors, output); } else { - const plus_sign: u8 = '+'; - try output(context, @as(*const [1]u8, &plus_sign)[0..]); - const new_value = @intCast(uint, value); + try output(context, "+"); + const new_value = @intCast(Uint, value); return formatIntUnsigned(new_value, base, uppercase, new_options, context, Errors, output); } } @@ -1166,6 +1164,8 @@ test "bufPrintInt" { var buffer: [100]u8 = undefined; const buf = buffer[0..]; + std.testing.expectEqualSlices(u8, "-1", bufPrintIntToSlice(buf, @as(i1, -1), 10, false, FormatOptions{})); + std.testing.expectEqualSlices(u8, "-101111000110000101001110", bufPrintIntToSlice(buf, @as(i32, -12345678), 2, false, FormatOptions{})); std.testing.expectEqualSlices(u8, "-12345678", bufPrintIntToSlice(buf, @as(i32, -12345678), 10, false, FormatOptions{})); std.testing.expectEqualSlices(u8, "-bc614e", bufPrintIntToSlice(buf, @as(i32, -12345678), 16, false, FormatOptions{}));