【问题标题】:Why isn't C respecting my unsigned declaration? [duplicate]为什么 C 不尊重我的未签名声明? [复制]
【发布时间】:2020-01-12 18:21:33
【问题描述】:

Total C 新手在这里。当我运行以下代码时:

int main(int argc, char *argv[])
{
  int unsigned x = 1;
  printf("%d\n", x);
  x = x - 2;
  printf("%d\n", x);
}

我得到了输出:

1
-1

即签名输出。

编译命令是cc -Wall -g -fno-stack-protector exCurrent.c -o exCurrent,我在最近的 macOS 10.14 上运行它。

发生了什么事?

【问题讨论】:

  • printf 不知道传递参数的类型。它从格式字符串中推断出它们。
  • 尝试传递%u

标签: c


【解决方案1】:

printf 不知道您传递给它的变量的类型。它只是查看其位,然后尝试根据格式化程序(%d 此处)表示该位模式。

如您所见,有符号和无符号整数的位模式完全相同:

int main(int argc, char *argv[])
{
  unsigned int x = -1;
  int y = -1;
  printf("%X\n", x);
  printf("%X\n", y);
}

输出:

FFFFFFFF
FFFFFFFF

您可以使用%u 格式化程序查看变量的无符号整数表示:

int main(int argc, char *argv[])
{
  unsigned int x = 1;
  printf("%u\n", x);
  x = x - 2;
  printf("%u\n", x);
}

输出:

1
4294967295

【讨论】:

  • “查看其位,然后尝试根据格式化程序表示该位模式” - 范式转换!谢谢。
【解决方案2】:

检查 c 中的格式说明符。它是无符号整数的%u

【讨论】:

    【解决方案3】:

    C 尊重你的未签名运算符。

    问题是printf 只是接收到没有的操作数,并认为它是一个有符号整数,因为%d

    这意味着,您不应使用%d,而应使用无符号整数的格式字符串%u

    在从 1 中减去 2 时,您将得到 -1 作为有符号整数。无符号等效值是可能的最高无符号整数(取决于您的系统,例如 2^32-1,如果它是 32 位整数)

    因此,如果您使用%u 而不是%d,您将得到一个(如果您不考虑long,则可能是最高的)整数结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-27
      相关资源
      最近更新 更多