gpt4 book ai didi

关于无符号和整数表达式的混淆

转载 作者:行者123 更新时间:2023-11-30 20:52:47 25 4
gpt4 key购买 nike

我有这些逻辑表达式,但我不明白如何计算它们。有人能帮我吗?我知道存在从无符号值到有符号值的转换,但是如何应用它?

int v=0xFFFD;
unsigned z=1;
(v+z)/2=32767

结果显示了这个数字,但教科书没有解释原因。您是否转换值 v从十六进制到二进制?在那一步之后,我应该做什么?这里还有另外 2 个使用无符号表达式的示例:

(v+1)/2=-1
-1>z

这怎么可能?你如何证明这一点?还有别的事。十六进制形式的二进制有 16 位。如何对输入的值使用符号位方法?

最佳答案

在这个答案中,我们将假设:

  • intunsigned (又名 unsigned int )是 16 位。
  • int 使用二进制补码,从 unsignedint 的转换会生成由与 int 相同的 16 位表示的 unsigned 。值得注意的是,对于值从 32768 到 65535 的 unsigned x(int) xx -65536。

十六进制、十进制和八进制是表示数字的符号。 “0XFFFD”不是数字;它是一串字符。它代表数字 65533。我们假设读者对十六进制足够熟悉,因此不需要对具体计算进行解释。十六进制“0xFFFD”、十进制“65533”和八进制“0177775”是代表相同数字的不同字符串。

int v = 0xFFFD; 中,编译器将 0xFFFD 转换为数字 65533。由于该数字无法用 int 表示,因此根据 C 规则,编译器将其指定为 unsigned int 类型。然后使用 65533 这个 unsigned 值初始化 int 。这需要从 unsigned 转换为 int 。根据上述假设,结果为 65533 − 65536 = −3。因此 v 被初始化为 -3。

unsigned z = 1; 中,1 是一个值为 1 的 int,它平淡无奇地转换为 unsigned,并且 z 被初始化为 1。

(v+z)/2 中:

  • vintzunsigned 。根据C的规则, v 被转换为 unsigned 。将 −3 转换为 unsigned 会产生 65533。(规则指定,在这种情况下,根据需要多次添加或减去 65536,以使其处于 unsigned 的范围内。一次加法就足够了。)。
  • 那么我们有 65533 + 1,即 65534。
  • 那么 65534/2 = 32767。

(v+1)/2 中:

  • vint1int 。根据C的规则,我们继续使用int
  • v 是 -3,所以我们有 -3 + 1,即 -2。
  • 那么 −2/2 = −1。

-1>z 中:

  • -1intz 是无符号的。根据C的规则, int 被转换为 unsigned 。为此,我们需要将 65536 添加一次,即 −1 + 65536 = 65535。
  • 然后我们有 65535 > zz 是 1,所以这是 65535 > 1,这是正确的。

关于关于无符号和整数表达式的混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57513791/

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