gpt4 book ai didi

formatting - 如何将带符号的整数格式化为带符号的十六进制表示形式?

转载 作者:行者123 更新时间:2023-11-29 07:50:51 24 4
gpt4 key购买 nike

我最初的意图是以保留数字符号的方式将带符号的原始数字转换为其十六进制表示形式。事实证明,LowerHexUpperHex 和带符号原始整数的亲戚的当前实现将简单地将它们视为无符号。不管我添加了什么额外的格式化标志,这些实现似乎只是将数字重新解释为用于格式化目的的无符号对应数字。 ( Playground )

println!("{:X}", 15i32);           // F
println!("{:X}", -15i32); // FFFFFFF1 (expected "-F")
println!("{:X}", -0x80000000i32); // 80000000 (expected "-80000000")
println!("{:+X}", -0x80000000i32); // +80000000
println!("{:+o}", -0x8000i16); // +100000
println!("{:+b}", -0x8000i16); // +1000000000000000

std::fmt 中的文档不清楚这是否应该发生,甚至是否有效,并且 UpperHex (或任何其他格式特征)没有提到有符号整数的实现将数字解释为无符号。 Rust 的 GitHub 存储库上似乎也没有相关问题。 (增补后通知:1.24.0 开始,文档已得到改进以正确解决这些问题,请参阅问题 #42860)

最终,人们可以为任务实现特定的功能(如下所示),不幸的是,它与格式化程序 API 的兼容性不是很好。

fn to_signed_hex(n: i32) -> String {
if n < 0 {
format!("-{:X}", -n)
} else {
format!("{:X}", n)
}
}

assert_eq!(to_signed_hex(-15i32), "-F".to_string());

有符号整数类型的这种行为是故意的吗?有没有办法在仍然遵守标准 Formatter 的同时执行此格式化过程? ?

最佳答案

Is there a way to do this formatting procedure while still adhering to a standard Formatter?

是的,但是您需要创建一个新类型以提供 UpperHex 的独特实现。这是一个尊重 +#0 标志的实现(可能更多,我还没有测试过):

use std::fmt::{self, Formatter, UpperHex};

struct ReallySigned(i32);

impl UpperHex for ReallySigned {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
let prefix = if f.alternate() { "0x" } else { "" };
let bare_hex = format!("{:X}", self.0.abs());
f.pad_integral(self.0 >= 0, prefix, &bare_hex)
}
}

fn main() {
for &v in &[15, -15] {
for &v in &[&v as &UpperHex, &ReallySigned(v) as &UpperHex] {
println!("Value: {:X}", v);
println!("Value: {:08X}", v);
println!("Value: {:+08X}", v);
println!("Value: {:#08X}", v);
println!("Value: {:+#08X}", v);
println!();
}
}
}

关于formatting - 如何将带符号的整数格式化为带符号的十六进制表示形式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44711012/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com