我使用固定宽度整数类型std::int8_t
和std::uint8_t
,它们包含在C ++中,因为C ++ 11(header <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
and unsigned char
are guaranteed to be distinct types,所以这是正常的,即使你的编译器char
被签名,它也不被认为与signed char
相同。
char和signed char之间的区别只是正式的吗?
没有;根据编译器和编译器选项,char
可以是有符号或无符号的;无论如何,signed char
总是签字。
(现在,如果你问我,平原char
应该总是unsigned
,但这只是我的意见)
类型char
不需要签名,即使在许多系统上也是如此。
甚至在那种情况下,it is distinct from the type signed char
。
int8_t
很可能是signed char
的别名。
char并不总是签名,就像各种CPP实现之间发生的许多其他不一致一样。当我从MingGw的代码块转移到我的简单手机编译器时,我才意识到这一点,它使用了unsigned --- char。
另一个不一致是void指针和operator ++。 MingGw为该运算符定义了一个字节的增量。但是大多数其他编译器都不会编译void指针的增量。
然后有字节序。
此外,每个编译器都有自己的预处理器,它使用不同的属性和东西。
这些不一致使得C和CPP中的编程非常困难,因为未定义的行为可能导致很难找到的崩溃和逻辑错误。
像Java这样的语言非常适合使用,因为Java编译器是由一个源代码Oracle创建的,它是一种只编写一种语言。
但是,为什么语言中存在不一致,这不是CPP错误。 CPP和C坚持低级方法,每个处理器,每个硬件都是不同的。 CPP考虑到了这些因素。
试图为硬件编写通用代码会产生更慢的代码。