代码之家  ›  专栏  ›  技术社区  ›  Jack Kinsella

为什么C不尊重我未签名的声明?[副本]

c
  •  0
  • Jack Kinsella  · 技术社区  · 5 年前

    总共是C个新手。当我运行以下代码时:

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

    我得到输出:

    1
    -1
    

    i、 e.签名输出。

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

    怎么了?

    3 回复  |  直到 5 年前
        1
  •  2
  •   ruohola    5 年前

    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
  •  1
  •   Anirban166 msc    5 年前

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

        3
  •  1
  •   dan1st    5 年前

    C尊敬您的未签名接线员。

    问题是 printf 只接收不带的操作数,并认为它是带符号的int,因为 %d .

    这意味着,你不应该使用 %丁 但是无符号整数的格式字符串, %u 相反。

    当减去 2 从1开始,你会得到 -1 作为有符号整数。无符号等价物是可能的最高无符号整数(取决于您的系统,例如,如果是32位整数,则为2^32-1)

    所以,如果你用 %u型 而不是 %丁 ,如果你不考虑 long )整数结果。