固定宽度整数类型 std::uint8_t 和 std::int8_t 的实现,C++

Implementation of fixed width integer types std::uint8_t and std::int8_t, C++

本文关键字:std 实现 C++ int8 uint8 固定宽度 整数 类型      更新时间:2023-10-16

我正在使用自 C++11 年以来包含在C++中的固定宽度整数类型 std::int8_tstd::uint8_t(标头 <cstdint> (。我使用 gcc 编译器进行 c++ 编程(Linux,gcc --version 4.8.2(。

在我的机器上

生产线
#include <cstdint>
#include <type_traits>
//...
std::cout << std::is_same<std::uint8_t,unsigned char>::value << std::endl;
std::cout << std::is_same<std::int8_t,char>::value << std::endl;

给出输出

1
0

换句话说:std::uint8_t unsigned char实现,但std::int8_t不是char实现的!我不知道std::int8_t怎么可能没有实现为char.问题:如何解释这个结果?

可能他们使用了signed char,这是明智的,因为编译器选项(在 gcc -fsigned-char-funsigned-char 中(可以改变普通char的符号性。

请注意,charsigned charunsigned char 保证是不同的类型,因此,即使在编译器上char是有符号的,它也不被视为与 signed char 相同。

字符

和签名字符之间的区别只是正式的吗?

不; char可以签名或无符号,具体取决于编译器和编译器选项; 无论如何,signed char总是签名的。

(现在,如果你问我,简单的char应该永远unsigned,但这只是我的意见(

类型 char 不需要签名,即使在许多系统上也是如此。
即使是这种情况,它也不同于类型 signed char .

int8_t很可能是signed char的别名。

char并不总是

有符号的,就像各种CPP实现之间发生的许多其他不一致一样。当我从代码块上的 MingGw 转移到我的简单手机编译器时,我才意识到这一点,它使用无符号---字符。

另一个不一致的是 void 指针和运算符 ++。MingGw 为该运算符定义了一个字节增量。但大多数其他编译器不会编译 void 指针的增量。

然后是字节序。

此外,每个编译器都有自己的预处理器,它使用不同的属性和东西。

这些不一致使得用C和CPP编程非常困难,因为未定义的行为会导致崩溃和逻辑错误,而这些错误可能很难发现。

像Java这样的语言使用起来非常舒适,因为Java编译器是由一个来源Oracle制作的,它是一种编写一次的语言。

但是,为什么语言中存在不一致并不是CPP的错。CPP和C坚持低级方法,每个处理器,每个硬件都是不同的。CPP考虑到了这些事情。

尝试为硬件编写通用代码将产生速度较慢的代码。