这段代码使用的是哪种语言标准,可以打印出“-1”?
将整数转换为有符号整数类型时,如果该值无法在该类型的对象中表示(C90 6.2.1.2、C99和C11 6.3.1.3),则产生的结果或引发的信号如下:
对于转换为宽度为N的类型,该值被模2^N减小以使其在类型范围内;不引发信号。
因此,对我来说,将
是否有其他语言规定,在模除之后我们只需重新解释位?或者有其他标准的部分优先于我引用的部分吗?
unsigned int u = UINT_MAX;
signed int s = u;
printf("%d", s);
https://en.cppreference.com/w/c/language/conversion
否则,如果目标类型是有符号的,则行为是实现定义的(可能包括引发信号)。https://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html#Integers-implementation
GCC仅支持二进制补码整数类型,所有位模式都是普通值。将整数转换为有符号整数类型时,如果该值无法在该类型的对象中表示(C90 6.2.1.2、C99和C11 6.3.1.3),则产生的结果或引发的信号如下:
对于转换为宽度为N的类型,该值被模2^N减小以使其在类型范围内;不引发信号。
因此,对我来说,将
UINT_MAX
转换为int
意味着将UINT_MAX
除以2^(CHAR_BIT * sizeof(int))
。举个例子,对于32位的整数,0xFFFFFFFF / 2^32 = 0xFFFFFFFF
。所以这并没有真正解释值“-1”是如何出现在int
中的。是否有其他语言规定,在模除之后我们只需重新解释位?或者有其他标准的部分优先于我引用的部分吗?