gpt4 book ai didi

c - 尝试解析C11标准中常用的算术转换规则

转载 作者:行者123 更新时间:2023-12-02 01:43:38 26 4
gpt4 key购买 nike

我正在尝试理解 C11 标准的算术转换规则。该标准将等级严格递减的不同整数类型指定为:

long long int
long int
int
short int
char

此外,所有其他类型在默认情况下都是有符号的,而 char 是有符号的还是无符号的,具体取决于实现。所有类型都有签名和未签名版本。该标准进一步将真实类型定义为:

long double
double
float

我阅读标准的方式是,如果我们有添加例如

a + b

a是实数类型,b是任意整数类型,那么b被转换为a<的类型。换句话说,如果 a 的类型为 floatb 的类型为 long long int,我们首先转换 bfloat 然后做加法,还是我读错了?换句话说,整数类型的等级是多少并不重要,它是指定整数类型转换为什么实型的实型。

最后,我很难理解这个。假设 a 是比有符号的 b 更高等级的无符号,b 会发生什么?该标准规定我们将 b 转换为 a 的未签名版本。这是怎么做到的?我看到此转换有两个合乎逻辑的选项。假设 a 是一个 unsigned long 而 b 是一个 signed int,那么我们可以这样做:

signed int -> unsigned int -> unsigned long
signed int -> signed long -> unsigned long

这些可能会产生不同的值,因为在第一种情况下我们将 UINT_MAX+1 添加到 b 而在第二种情况下我们将 ULONG_MAX+1 添加到 b if b 为负。

最后,如果说 a 是比 b 更高等级的有符号类型,但是 b 的取值范围可以不适合 a 的类型?这似乎是该标准所指的最后一种可能情况?我假设这就是你得到的,例如一个 32 位架构,当 int 和 long 具有相同大小的表示形式时,一个带符号的 long 不必容纳所有无符号的 int。

我的理解是否正确,或者我是否以错误的方式解释了某些部分?

最佳答案

[...] and a is a real type and b is any integer type, then b is converted to the type of a. In other words, if a has type float and b has type long long int, we first convert b to a float and then do the addition [...]

是的。

Finally, I have trouble following this. Assume that a is unsigned of higher rank than b which is signed, what happens to b? The standard says that we convert b to the unsigned version of a. How is this done? [...]

转换 b 的(算术),添加/减去 ULONG_MAX + 1,直到该值适合 一个

你最后一个例子,适用C11 (n1570) 6.3.1.8 p1的最后一种情况,两个操作数都转换为long int对应的unsigned类型,即unsigned long int 。 (我不确定这一点,但似乎标准(隐含地?)要求所有有符号整数类型(包括扩展类型)都有相应的无符号类型。)

关于c - 尝试解析C11标准中常用的算术转换规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26961622/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com