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

时间:2014-08-10 15:50:05

标签: c++ c++11 integer

我正在使用自C ++ 11(标题std::int8_t)以来C ++中包含的固定宽度整数类型 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。问题:如何解释这个结果?

3 个答案:

答案 0 :(得分:7)

可能他们使用signed char,这是明智的,因为编译器选项(在gcc -fsigned-char-funsigned-char中)可以更改普通char的签名。

请注意char, signed char and unsigned char are guaranteed to be distinct types,这是正常的,即使您的编译器char已签名,也不能认为它与signed char相同。< / p>

  

char和signed char之间的区别仅仅是正式的吗?

没有; char可以是有符号或无符号的,具体取决于编译器和编译器选项;无论如何,signed char始终都会签名。

(现在,如果你问我,普通char应该始终是unsigned,但那只是我的意见)

答案 1 :(得分:3)

类型char不需要签名,即使在许多系统上也是如此 即使是这种情况,it is distinct from the type signed char

int8_t可能是signed char的别名。

答案 2 :(得分:0)

与各种CPP实现之间发生的许多其他不一致一样,

char并不总是被签名。当我从代码块上的MingGw迁移到使用无符号--- char的简单电话编译器时,才意识到这一点。

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

然后是字节序。

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

这些不一致使得在C和CPP中进行编程变得非常困难,因为未定义的行为可能会导致崩溃和逻辑错误,这很难找到。

像Java这样的语言非常易于使用,因为Java编译器是由一个来源Oracle编写的,并且是一种一次性编写的语言。

但是,为什么语言不一致不是CPP的错。 CPP和C坚持低级方法,并且每个处理器,每个硬件的制造方式都不相同。 CPP考虑了这些因素。

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