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

问题描述 投票:0回答:3

我使用固定宽度整数类型std::int8_tstd::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 charstd::int8_t未实现为char!我没有(合理的)想法如何将std::int8_t实现为char。问题:如何解释这个结果?

c++ c++11 integer
3个回答
7
投票

可能他们使用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,但这只是我的意见)


3
投票

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

int8_t很可能是signed char的别名。


0
投票

char并不总是签名,就像各种CPP实现之间发生的许多其他不一致一样。当我从MingGw的代码块转移到我的简单手机编译器时,我才意识到这一点,它使用了unsigned --- char。

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

然后有字节序。

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

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

像Java这样的语言非常适合使用,因为Java编译器是由一个源代码Or​​acle创建的,它是一种只编写一种语言。

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

试图为硬件编写通用代码会产生更慢的代码。

© www.soinside.com 2019 - 2024. All rights reserved.