输入正有符号整数到无符号整数(反之亦然)

问题描述 投票:1回答:1
union   Positive_Small {
    int8_t  s;
    uint8_t u;
};

union Positive_Small    x = {.s = 3};
union Positive_Small    y = {.u = 4};

assert(x.u == 3);
assert(y.s == 4);

这是定义的行为吗?标准是否保证有符号整数类型的正范围与其无符号等效类型具有相同的表示形式?

我认为没有足够疯狂的实现(DS9K可能?)没有做到,但它是否定义了?

c language-lawyer unsigned signed type-punning
1个回答
4
投票

简而言之,是 - 标准保证对于共享正值范围,无符号类型的值的按位表示与有符号类型的相同。

C11 Section 6.2.5 Types定义了这个(以及许多其他术语和行为):

¶6对于每个有符号整数类型,都有一个相应的(但不同的)无符号整数类型(用关键字unsigned指定),它使用相同的存储量(包括符号信息)并具有相同的对齐要求。类型_Bool和对应于标准有符号整数类型的无符号整数类型是标准无符号整数类型。与扩展有符号整数类型对应的无符号整数类型是扩展无符号整数类型。标准和扩展无符号整数类型统称为无符号整数类型.40)

¶9有符号整数类型的非负值范围是相应无符号整数类型的子范围,每种类型中相同值的表示相同.41)涉及无符号操作数的计算永远不会溢出,因为结果无法用结果无符号整数类型表示的数字减去模数,该数字大于可由结果类型表示的最大值。

40)因此,本标准中关于无符号整数类型的任何语句也适用于扩展无符号整数类型。

41)相同的表示和对齐要求意味着可互换性作为函数的参数,函数的返回值和联合的成员。

特别是dbush pointed outsection 6.2.6 Representation of typessection 6.2.6.2 Integer types也包含相关信息:

¶2对于有符号整数类型,对象表示的位应分为三组:值位,填充位和符号位。不需要任何填充位; signed char不得有任何填充位。应该只有一个符号位。作为值位的每个位应具有与相应无符号类型的对象表示中的相同位相同的值(如果有符号类型中有M个值位且无符号类型中有N,则M≤N)。如果符号位为零,则不应影响结果值。如果符号位为1,则应以下列方式之一修改该值:

  • 符号位0的相应值被否定(符号和幅度);
  • 符号位的值为 - (2M)(二进制补码);
  • 符号位的值为 - (2M-1)(1'补码)。

这些适用中的哪一个是实现定义的,将符号位1和所有值位0(对于前两个),或者符号位和所有值位1(对于1'补码)的值是否是陷阱表示或正常值。在符号和幅度以及1'补码的情况下,如果该表示是正常值,则称为负零。

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