我有以下代码:
#include <iostream>
using namespace std;
typedef uint8_t byte;
int main()
{
byte x[5] = {0,1,2,3,4};
byte* xptr = x;
for (int i = 0; i < 5; ++i)
{
cout << "\n x[" << i
<< "] = " << *xptr
<< " at " << xptr;
xptr = xptr + 1;
}
xptr = xptr - 5;
cout << "\n\n\n";
}
输出包含如下奇怪的字符:
我希望这是因为uint8_t
的基础类型与char
数据类型相关。
我知道我可以进行一些明确的类型转换,以使其工作如下:
cout << "\n x[" << i
<< "] = " << (int)*xptr
<< " at " << (void*)xptr;
另外,我知道我可以自己上课来处理它。
但是,如果可能,我不想使用类型转换或制作特殊类。
我浏览了互联网并在StackOverflow上获得了this,但它没有帮助。
那么,是否有一种在C ++上具有8位整数类型的本机方式,其行为与所有标准库的int
和short
完全相同?或者这只是无数C ++难以理解的*功能缺席之一?
*至少对我而言。
答案 0 :(得分:0)
为了便于阅读,您可以use hexadecimal base并转换为int:
for (int i = 0; i < 5; ++i)
{
cout << "\n x[" << i << "] = " << (int)*xptr << " at " << hex << (int)xptr;
xptr++;
}
输出:
x[0] = 0 at 8ffeb0
x[1] = 1 at 8ffeb1
x[2] = 2 at 8ffeb2
x[3] = 3 at 8ffeb3
x[4] = 4 at 8ffeb4
答案 1 :(得分:0)
uint8_t
和int8_t
是C ++上真正的8位整数。但是因为它们typedef
超过char
s(如果它们存在,则无法保证),它们被标准库解释并视为字符。不幸的是,你只需要使用演员。
旁注:你不需要在这里使用指针,使用数组索引:
for (int i = 0; i < 5; ++i)
{
cout << "\n x[" << i
<< "] = " << (int)x[i]
<< " at " << hex << &x[i] << dec;
}
附注2:C ++ 17将引入std::byte
类型,但它只是unsigned char
使用enum class
的奇怪包装。它只对整数类型实现按位运算符和转换函数,因此它不是你想要的。
答案 2 :(得分:0)
如果您只关注可读输出格式,并且每次都不想输入强制转换表达式,则可以简单地添加一元运算符:
cout << +x;
执行隐式转换为int
。
示例:
#include <iostream>
int main()
{
char ch = 'D';
std::cout << ch << "\n"; // Displays "D"
std::cout << +ch << "\n"; // Displays "68"
}
可悲的是,没有类似std :: dec I / O操纵器的ostream选项可以自动执行此操作。