15

这个答案和附加的评论中,Pavel Minaev提出了以下论点,即在 C 中,唯一uint8_t可以 typedef 的类型是charand unsigned char。我正在看这份 C 标准草案

  • 的存在uint8_t意味着相应类型int8_t(7.18.1p1) 的存在。
  • int8_t是 8 位宽并且没有填充位 (7.18.1.1p1)。
  • 相应的类型具有相同的宽度(6.2.5p6),因此uint8_t也是 8 位宽。
  • unsigned charCHAR_BIT位宽(5.2.4.2.1p2 和 6.2.6.1p3)。
  • CHAR_BIT至少为 8 (5.2.4.2.1p1)。
  • CHAR_BIT最多为 8,因为要么uint8_tis ,要么它是宽度是(6.2.6.1p4)的倍数unsigned char的非unsigned char、非位字段类型。CHAR_BIT

基于这个论点,我同意,如果uint8_t存在,那么它unsigned char都具有相同的表示形式:8 个值位和 0 个填充位。这似乎并没有强迫它们是同一类型(例如,6.2.5p14)。

是否允许将uint8_ttypedef 定义为具有相同表示的扩展无符号整数类型 (6.2.5p6) unsigned char当然它必须是 typedef'd (7.18.1.1p2),并且它不能是任何标准的无符号整数类型unsigned char(或者char如果它恰好是无符号的)。这种假设的扩展类型不是字符类型(6.2.5p15),因此不符合对不兼容类型(6.5p7)对象的别名访问资格,这让我觉得编译器编写者想要这样做事物。

4

4 回答 4

5

If uint8_t exists, the no-padding requirement implies that CHAR_BIT is 8. However, there's no fundamental reason I can find why uint8_t could not be defined with an extended integer type. Moreover there is no guarantee that the representations are the same; for example, the bits could be interpreted in the opposite order.

While this seems silly and gratuitously unusual for uint8_t, it could make a lot of sense for int8_t. If a machine natively uses ones complement or sign/magnitude, then signed char is not suitable for int8_t. However, it could use an extended signed integer type that emulates twos complement to provide int8_t.

于 2012-10-01T00:28:08.700 回答
3

In 6.3.1.1 (1) (of the N1570 draft of the C11 standard), we can read

The rank of any standard integer type shall be greater than the rank of any extended integer type with the same width.

So the standard explicitly allows the presence of extended integer types of the same width as a standard integer type.

There is nothing in the standard prohibiting a

typedef implementation_defined_extended_8_bit-unsigned_integer_type uint8_t;

if that extended integer type matches the specifications for uint8_t (no padding bits, width of 8 bits), as far as I can see.

So yes, if the implementation provides such an extended integer type, uint8_t may be typedef'ed to that.

于 2012-10-01T00:28:33.260 回答
0

uint8_t可能存在并且是与 不同的类型unsigned char

这其中的一个重要含义是重载解决方案。是否:

uint8_t by = 0;
std::cout << by;

用途

  1. operator<<(ostream, char)
  2. operator<<(ostream, unsigned char)或者
  3. operator<<(ostream, int)
于 2015-01-25T05:30:46.157 回答
-1

int8_t 和 uint8_t 仅通过 REPRESENTATION 而不是内容(位)不同。int8_t 使用低 7 位作为数据,第 8 位表示“符号”(正或负)。因此 int8_t 的范围是从 -128 到 +127(0 被认为是正值)。

uint8_t 也是 8 位宽,但其中包含的数据始终为正。因此 uint8_t 的范围是从 0 到 255。

考虑到这个事实,char 是 8 位宽。unsigned char 也将是 8 位宽,但没有“符号”。类似地,short 和 unsigned short 都是 16 位宽。

但是,如果“ unsigned int”是 8 位宽,那么 .. 因为 C 不是太纳粹,所以它是允许的。为什么编译器作者会允许这样的事情?可读性!

于 2012-10-01T00:07:07.413 回答