固定宽度整数类型 std::uint8_t 和 std::int8_t 的实现,C++
Implementation of fixed width integer types std::uint8_t and std::int8_t, C++
我正在使用自 C++11 年以来包含在C++中的固定宽度整数类型 std::int8_t
和 std::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
的符号性。
请注意,char
、signed char
和 unsigned char
保证是不同的类型,因此,即使在编译器上char
是有符号的,它也不被视为与 signed char
相同。
字符和签名字符之间的区别只是正式的吗?
不; char
可以签名或无符号,具体取决于编译器和编译器选项; 无论如何,signed char
总是签名的。
(现在,如果你问我,简单的char
应该永远unsigned
,但这只是我的意见(
类型 char
不需要签名,即使在许多系统上也是如此。
即使是这种情况,它也不同于类型 signed char
.
int8_t
很可能是signed char
的别名。
有符号的,就像各种CPP实现之间发生的许多其他不一致一样。当我从代码块上的 MingGw 转移到我的简单手机编译器时,我才意识到这一点,它使用无符号---字符。
另一个不一致的是 void 指针和运算符 ++。MingGw 为该运算符定义了一个字节增量。但大多数其他编译器不会编译 void 指针的增量。
然后是字节序。
此外,每个编译器都有自己的预处理器,它使用不同的属性和东西。
这些不一致使得用C和CPP编程非常困难,因为未定义的行为会导致崩溃和逻辑错误,而这些错误可能很难发现。
像Java这样的语言使用起来非常舒适,因为Java编译器是由一个来源Oracle制作的,它是一种编写一次的语言。
但是,为什么语言中存在不一致并不是CPP的错。CPP和C坚持低级方法,每个处理器,每个硬件都是不同的。CPP考虑到了这些事情。
尝试为硬件编写通用代码将产生速度较慢的代码。
- 我应该实现右值推送功能吗?我应该使用std::move吗
- std::random_device是如何实现的
- 理解GCC中的std::pow实现
- 在没有未定义行为的情况下实现类似std::vector的容器
- std::unordered_map 搜索算法是如何实现的?
- C++标准是否允许<double>在没有开销的情况下实现 std::可选
- std::背后的基本原理assignable_from可能的实现
- 在std::launder之前,std::vector的所有实现都是不可移植的吗?
- 为什么 std::lerp 不适用于任何已实现所需操作的类型?
- glibcxx STL 在实现 std::valarray::sum() 时是否不正确?
- C++矩阵类运算符使用 std::common_type_t 和复数的实现
- std::max() 函数与定点实现的比较中的问题
- 使用 std::forward_list 返回错误的队列实现
- std::bind 是否实现了 std::ref 和 std::cref 来消除函数调用的歧义?
- 在 x86 上实现 std::atomic_thread_fence(std::memory_order_seq_cst
- std::extent 实现详细信息说明
- 使用 std::call_once 实现类似单例的功能
- 了解 std::is_base_of 的重新实现
- 如何在跳过所有内部实现的同时跳转到 GDB 中 std::function 中的函数?
- std::实现移动