首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C++中使用<<将无符号/有符号字符或<cstdint>类型输出为整数

如何在C++中使用<<将无符号/有符号字符或<cstdint>类型输出为整数
EN

Stack Overflow用户
提问于 2010-10-29 15:48:40
回答 5查看 708关注 0票数 2

背景:

我有模板流运算符(例如operator << (ostream &, std::vector <T>)) (输出容器元素可能是一些8位整数类型(例如unsigned charint_least8_t等))。

问题:

默认情况下,这些类型输出为char (ASCII)。我只对ASCII型变量使用了char (或wchar_t等),从未使用过无符号/有符号类型。如何让这些其他8位类型始终输出为signed int / unsigned int (numbers),即使调用者不知道该类型?

第一次尝试:

我已经尝试过(和GCC一起),例如,在operator << (ostream &, unsigned char)中定义一个强制转换(即stream << static_cast <int> (value) )。这对unsigned char值有效,但是uint8_t仍然以char的形式输出。

相同的底层类型(例如,unsigned/signed char不能在重载中使用,因此我不能定义例如operator << (ostream &, int_fast8_t)的重载。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-10-29 15:53:05

我想到的一种方法是使用类型特征来定义每种类型的输出类型。对于每种类型,您都必须手动声明。可以将特征定义为模板结构,该结构专用于具有与数据类型本身不同的输出类型的每个数据类型:

代码语言:javascript
运行
复制
template< T >
struct output_trait {
    typedef const T & output_type;
}

在运算符中,您可以这样写:

代码语言:javascript
运行
复制
std::cout << static_cast< output_trait< T >::output_type >( variable ) << std::endl;

默认情况下,这不会进行强制转换,但对于output_trait专门化的类型,它将进行强制转换:

代码语言:javascript
运行
复制
template<>
struct output_trait< unsigned char > {
    typedef unsigned int output_type;
}
票数 2
EN

Stack Overflow用户

发布于 2010-10-29 16:00:39

您混淆了保存在变量中的实际数据与您选择打印它的任何表示形式。

可以这样想:charsintsdoubleslongs等等,它们都只是你用来存储数字的内存区块。字符是一个介于0和255 (或-128和127)之间的数字--您可以选择将其表示为ASCII字符、数字或借助OpenGL表示为天空中的星星。

如果您想查看字符'a‘后面的数字,只需指示您的程序将该内存块(对于您而言包含一个'a')视为一个数字。使用强制转换。这里:

http://www.cplusplus.com/doc/tutorial/typecasting/

看看这是否有帮助!

票数 3
EN

Stack Overflow用户

发布于 2010-10-29 15:52:44

如果我没理解错的话..输出如下:

代码语言:javascript
运行
复制
std::cout << ( unsigned int )char << '\n';

或更多c++样式-使用static_cast,例如:

代码语言:javascript
运行
复制
int main()
{
    char a = 'a';
    char b = 97;
    std::cout << static_cast< unsigned int >( a ) << '\n';
    std::cout << static_cast< unsigned int >( b ) << '\n';
    return 0;
}

两个std::cout将打印相同的内容:第一个是'a'97的ASCII码,第二个是存储在b中的值97ab是完全相同的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4049986

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档