fn get_min_max(t: u8) -> String {
let string: String = format!(
"i{t} min:{:?},max:{:?} ;u32 min:{:?},max:{:?}",
t,
i(t)::MIN,
i(t)::MAX,
u(t)::MIN,
u(t)::MAX
);
string
}
1
共 3 条评论, 1 页
评论区
写评论首先t的取值范围很小,只有8,16,32,64,128,所以完全可以硬编码到一个表里,最后查表 其次,u系列范围永远是
0
-(1<<t)-1
,i系列范围永远是-(1<<(t-1))
-(1<<t)-1
所以也可以直接算出来,非得现场编译有点舍本逐末// cargo-deps: concat-idents="1.1.2" use concat_idents::concat_idents; macro_rules! min_max { ($bit:literal) => { format!( "i{} min:{:?},max:{:?}; u{} min:{:?},max:{:?};", $bit, <concat_idents!(ident = i, $bit { ident })>::MIN, <concat_idents!(ident = i, $bit { ident })>::MAX, $bit, <concat_idents!(ident = u, $bit { ident })>::MIN, <concat_idents!(ident = u, $bit { ident })>::MAX ) }; } fn main() { println!("{}", min_max!(32)); // stdout: "i32 min:-2147483648,max:2147483647; u32 min:0,max:4294967295;" }
感觉这个是伪需求 姑且认为这个u8代表数据类型的位数,从语言本身角度讲,不加别的东西的话,如果不想硬编码的话就得考虑在运行时算出来; 不过楼主的写法像是在试图从位数转换为对应数据类型,真的有从语言层面支持这种特性的脚本语言吗😂