gpt4 book ai didi

c++ - 将未知大小的整数转换为无符号形式的最短/最干净的方法?

转载 作者:行者123 更新时间:2023-11-28 02:35:36 26 4
gpt4 key购买 nike

我正在编写一些代码来格式化一个十六进制数,目前它接受一个无符号的 64 位值。这一切都很好,直到我意识到它格式化了一个带有太多符号扩展的 32 位有符号整数,也就是说,“-1”变成了“ffffffffffffffff”。

我可以通过使用 numeric_limits ::digits 来解决这个问题:

template<class Int>
void Format(Int v) {
switch(std::numeric_limits<Int>::digits) {
case 7:
case 8:
CallFormatRoutine(0xFF & v);
break;
case 15:
case 16:
CallFormatRoutine(0xFFFF & v);
break;
case 31:
case 32:
CallFormatRoutine(0xFFFFFFFF & v);
break;
case 63:
case 64:
CallFormatRoutine(v);
break;
}
}

但我想知道是否有更好(更短)的方法。具体来说,一种更好的方式适用于 C++03 和 C++11。理想情况下,会有一些例程可以返回您提供的任何整数的无符号版本,但我无法在标准中找到它。如果我可以使用 C++11,我可以写这个,尽管可能需要强制转换以避免有关有符号/无符号转换的警告:

template<class Int>
void Format(Int v) {
std::make_unsigned<Int>::type unsigned_v = v;
CallFormatRoutine(unsigned_v);
}

有什么好的和简短的方法可以做到这一点,也适用于 C++03 吗?

最佳答案

std::make_unsigned 是完成您想要的最好和最短的方法,但您的示例中有一些错误。它应该看起来像这样:

template<class Int>
Format(Int v) {
auto unsigned_v = static_cast<typename std::make_unsigned<Int>::type>(v);
CallFormatRoutine(unsigned_v);
}

并且使用 C++14 编译器,相关行可以缩短为

auto unsigned_v = static_cast<std::make_unsigned_t<Int>>(v);

对于 C++03 编译器,有 boost::make_unsigned ,或者您可以自己实现它,但这有点乏味,因为您需要处理所有内置类型。

template<typename T>
struct make_unsigned
{ typedef T type; };

template<>
struct make_unsigned<char>
{ typedef unsigned char type; };

template<>
struct make_unsigned<signed char>
{ typedef unsigned char type; };

类似地,为 shortint 和其余整数类型添加特化。

关于c++ - 将未知大小的整数转换为无符号形式的最短/最干净的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27577515/

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