如何输出无符号/符号的字符或类型与整数<<在C ++中
-
27-09-2019 - |
题
背景:
我有模板流运营商(例如operator << (ostream &, std::vector <T>)
)(即输出容器元素可能是某个8位的整数类型的,(例如unsigned char
,int_least8_t
,等等)。
问题:
默认的是,这些类型如下char
(ASCII)输出。
我只用ASCII变量,总是有符号/符号类型char
(或wchar_t
或其他)。
我如何获得这些其他8位类型始终为signed int
/ unsigned int
(数字)输出,而不是,即使调用方不知道是什么类型?
首先尝试:
我曾尝试(与GCC)例如限定在它的铸造operator << (ostream &, unsigned char)
(即stream << static_cast <int> (value)
。对于unsigned char
值即工作,但然后uint8_t
仍获取输出作为char
。
在相同的基本类型(即unsigned/signed char
不能在重载用,所以无法定义的过载例如operator << (ostream &, int_fast8_t)
。
解决方案
,想到利用型性状来定义每个类型的输出类型的一种方法。你将不得不声明,对每种类型的手。性状可以被定义为提供专门用于每一个数据类型,它具有不同的输出型比的模板结构数据类型本身:
template< T >
struct output_trait {
typedef const T & output_type;
}
在您的运营商你写的:
std::cout << static_cast< output_trait< T >::output_type >( variable ) << std::endl;
这将做缺省没有铸造,但对于类型为哪些output_trait
是专业它会做的铸造:
template<>
struct output_trait< unsigned char > {
typedef unsigned int output_type;
}
其他提示
你混淆的变量中的实际数据,与您选择在打印任何表示。
考虑一下这种方式:chars
,ints
,doubles
,longs
,凡是,他们的记忆都只是块,为您储存号码一个字符是0和255(或-128和127)之间的数字。 - 你可以选择将其表示为ASCII字符,或为数字,或如用OpenGL的帮助下天空分
如果你想看到的字符后面的数字“一”,只是指示您的程序处理的内存块(为你包含了一个“A”)为数字。使用强制类型转换。这里:
http://www.cplusplus.com/doc/tutorial/typecasting/
看看是否有帮助!
您可以简单地将它转换:
#include<iostream>
int main()
{
uint8_t blah = 65;
std::cout << static_cast<int>(blah) << "\n";
return 0;
}
65
如果我明白你的权利..输出这样的:
std::cout << ( unsigned int )char << '\n';
或多个C ++式 - 使用的static_cast,例如:
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'
的ASCII码:97
,第二个 - 只是值97
,存储在B。既,a
和b
,是绝对相同的。
您可以之前,你输出它们丢掉。
std::cout << (unsigned int) container[index];