我正在使用自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
。问题:如何解释这个结果?
答案 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)
char并不总是被签名。当我从代码块上的MingGw迁移到使用无符号--- char的简单电话编译器时,才意识到这一点。
另一个不一致之处是void指针和operator ++。 MingGw为该运算符定义了一个字节的增量。但是大多数其他编译器不会编译void指针的增量。
然后是字节序。
此外,每个编译器都有自己的预处理器,该预处理器使用不同的属性和内容。
这些不一致使得在C和CPP中进行编程变得非常困难,因为未定义的行为可能会导致崩溃和逻辑错误,这很难找到。
像Java这样的语言非常易于使用,因为Java编译器是由一个来源Oracle编写的,并且是一种一次性编写的语言。
但是,为什么语言不一致不是CPP的错。 CPP和C坚持低级方法,并且每个处理器,每个硬件的制造方式都不相同。 CPP考虑了这些因素。
尝试为硬件编写通用代码将产生速度较慢的代码。