c++ 中的单独字节或 int8 数据类型
Separate byte or int8 data type in c++
我有以下代码:
#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;
另外,我知道我可以让 class 自己处理。
但是,我宁愿不使用类型转换,或者如果可能的话做一个特殊的class。
我通过互联网在 Whosebug 上找到了 this,但没有帮助。
那么,有没有一种本地方法可以在 C++ 上拥有一个 8 位整数类型,其作用与所有标准库的 int
和 short
完全一样?或者这只是无数 C++ 令人信服* 缺失的功能之一?
*至少对我来说是这样。
为了可读性,您可以 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
uint8_t
和 int8_t
是 C++ 上真正的 8 位整数。但是因为它们比 char
s 多 typedef
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
类型,但它只是使用 enum class
围绕 unsigned char
的奇怪包装器。它只实现按位运算符和整数类型之间的转换函数,所以它不是你要找的。
如果您只关心可读的输出格式,并且不想每次都输入强制转换表达式,您可以简单地在前面加上一元运算符:
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 选项可以自动执行此操作。
我有以下代码:
#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;
另外,我知道我可以让 class 自己处理。
但是,我宁愿不使用类型转换,或者如果可能的话做一个特殊的class。
我通过互联网在 Whosebug 上找到了 this,但没有帮助。
那么,有没有一种本地方法可以在 C++ 上拥有一个 8 位整数类型,其作用与所有标准库的 int
和 short
完全一样?或者这只是无数 C++ 令人信服* 缺失的功能之一?
*至少对我来说是这样。
为了可读性,您可以 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
uint8_t
和 int8_t
是 C++ 上真正的 8 位整数。但是因为它们比 char
s 多 typedef
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
类型,但它只是使用 enum class
围绕 unsigned char
的奇怪包装器。它只实现按位运算符和整数类型之间的转换函数,所以它不是你要找的。
如果您只关心可读的输出格式,并且不想每次都输入强制转换表达式,您可以简单地在前面加上一元运算符:
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 选项可以自动执行此操作。