【问题标题】:Implementation of fixed width integer types std::uint8_t and std::int8_t, C++固定宽度整数类型 std::uint8_t 和 std::int8_t 的实现,C++
【发布时间】:2014-08-10 15:50:05
【问题描述】:

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

【问题讨论】:

  • 试试std::is_same&lt;std::int8_t, signed char&gt;
  • char 可以在某些系统上签名。请尝试与 signed char 进行比较。
  • @Matteo Italia + 0x499602D2:对于签名的字符,它给出 1,你是对的。 char 和 signed char 的区别只是形式上的吗?
  • @sperber:你为什么这么说?听起来您认为char 总是签名的,但事实并非如此。 1) 可以通过编译器标志来改变; 2) 它甚至不一定在所有系统上都签名默认char 的签名完全由实现定义。
  • @LightnessRacesinOrbit:谢谢,我不知道它是实现定义的,确实认为它需要签名。

标签: c++ c++11 integer


【解决方案1】:

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

【讨论】:

  • "plain char 应该始终是无符号的" 那有什么意义呢?这就是unsigned char 的用途......
  • @LightnessRacesinOrbit:因为默认情况下(在大多数编译器中)有一个 signed 字符只是一个烦恼 - 在处理文本时 在处理“原始字节”时您从不希望看到有符号值(=>127 字节的负数); unsigned char 的类型令人讨厌(特别是当您在运行中强制转换 void 指针时)并且不允许构造函数样式的强制转换。此外,在极少数情况下,当您真正想要 signed char 时,无论如何您都必须明确要求它。我不知道,整个实现定义的签名对我来说似乎是无端的愚蠢。
  • 考虑到 char 和 int 一样是一个数字,所以应该按照与 int 相同的规则给出符号:intsigned intunsigned int 呢?山姆应为charsigned charunsigned char。但是有不一致的地方......
  • @EmilioGaravaglia:IMO 的实际使用需要 unsigned charsigned char 更频繁,但是好吧,这也比目前的情况要好,至少在极少数情况下你需要一个signed char,你不必明确指定signed
  • @LightnessRacesinOrbit:是的,这正是我的观点:明确规范。不一致。
【解决方案2】:

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

int8_t 很可能是signed char 的别名。

【讨论】:

    【解决方案3】:

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

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

    然后是字节序。

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

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

    Java 之类的语言使用起来非常舒适,因为 Java 编译器是由一个来源 Oracle 制作的,而且它是一种一次性编写的语言。

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

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

    【讨论】:

      猜你喜欢
      • 2015-10-06
      • 2013-04-01
      • 2017-11-24
      • 1970-01-01
      • 1970-01-01
      • 2019-10-14
      • 1970-01-01
      • 2015-09-30
      相关资源
      最近更新 更多