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?)
简洁,是的 - 标准可以保证,对于共享的正值范围,无符号类型的值的位表示与签名类型相同。
C11第6.2.5节类型定义了此(以及许多其他术语和行为):
¶6对于每种签名的整数类型,都有相应(但不同的)无符号整数类型(用关键字
unsigned
指定),该类型使用相同数量的存储(包括符号信息),并且具有相同的对齐要求。与标准签名的整数类型相对应的_Bool
类型和未签名的整数类型是标准的无符号整数类型。与扩展签名的整数类型相对应的无符号整数类型是扩展的无符号整数类型。标准和扩展的无符号整数类型共同称为 unsigned整数类型。 40)¶9签名整数类型的非负值范围是相应的无签名整数类型的子范围,每种类型中相同值的表示相同。 41) a计算涉及无符号操作数永远不会溢出,因为将结果无符号整数类型表示的结果降低了模型,该数字大于最大值的数字,而最大值可以用结果类型表示。
。 因此41)相同的表示和对齐要求旨在暗示互换性作为对函数的参数,函数返回值和工会成员的参数。
正如dbush指出的那样,第6.2.6节的类型表示,第6.2.6.2节的整数类型也包含相关信息:
¶2对于签名的整数类型,对象表示的位应分为三组:值位,填充位和符号位。不需要任何填充片;
signed char
不得有任何填充位。应该有一个标志。一个值位的每个位应具有与相应无符号类型的对象表示中相同位相同的值(如果符号类型中有 m 值位,并且 n 无符号类型中,然后在m≤n中)。如果符号位为零,则不会影响结果值。如果符号位是一个,则应通过以下方式之一修改该值:
- 否定了带有标志位0的相应值(符号和幅度);
- 符号位具有值 - (2 m )(二的补充);
- 符号位具有值 - (2 m -1)( and's的补语)。
以下哪一个是实现定义的,是符号位1和所有值位零(对于前两个)还是符号位和所有值位1(对于符号)的值,是陷阱表示或正常值。在符号和大小和一个补充的情况下,如果此表示为正常值,则称为a 负零。