【问题标题】:Can you explain the output of the following structure code?你能解释一下以下结构代码的输出吗?
【发布时间】:2017-08-07 20:07:44
【问题描述】:

我在谷歌上搜索了很多文章以寻找以下问题,但仍然没有找到任何好的答案。 从我的第一眼看,我可以得到 int x:3 这里 3 是宽度,如果我们分配大于 3 的 x 值会打印一些负值,如果我们分配小于 3 的值,则分配给 x 的值会正确打印。 谁能解释一下这段代码的输出是怎么来的。

     #include<stdio.h>
      1  struct Point
      2  {
      3  int x:3, y:4;
      4  };
      5 
      6  int main()
      7 {
      8  struct Point p1 = {6,3};
      9 
      10 printf ("x = %d, y = %d", p1.x, p1.y);
      11
      12  return 0;
      13  }

The output comes as:

    x = -2, y = 3

when i included stdio.h header file warning vanished but the output of x get chnaged first without header file the value of x is coming -4 now with stdio.h header file the value of x becomes -2.Why this is happening?? 

提前致谢!!

【问题讨论】:

  • 请以可读的方式格式化您的代码。在当前状态下,您可能只会收到反对票
  • 您没有足够的位来存储您的值。
  • 您显示的警告之一与您显示的代码不匹配。请创建一个Minimal, Complete, and Verifiable Example(不带行号,使用 cmets 标记错误或警告所在的行)并显示该代码中的错误。
  • @Someprogrammerdude,我已经在 c 编译器上编译了这段代码,它只显示了这个警告,我自己没有。
  • 不,您还没有编译您显示的代码。警告包含有关第 11 行分配的消息,但您显示的源在第 11 行没有这样的分配。此外,printf 调用不在第 12 行报告。请编辑您的问题以包含您使用的实际代码。

标签: c struct printf


【解决方案1】:

您正在尝试将值 6 存储到 3 位的有符号整数中,其中有 2 个值位和 1 个为符号保留的位。因此,无法放入 2 个值位的值 6 以实现定义的方式转换为有符号值。显然是通过使用Two's complement

“警告:隐式常量转换中的溢出”就是这样告诉你的。编译器尝试在有符号类型位字段中显示常量6。我不适合 - 你得到一个溢出,然后有一个到有符号类型的隐式类型转换。

【讨论】:

  • "试图将值 6 存储到 3 位的有符号整数中" --> 如果该字段是有符号的,则它是 ID。 int x:3 本来可以像 unsigned x:3 一样运行,但在 OP 的情况下代码确实像 signed int x:3 那样运行。
  • ...there are 2 value bits and 1 bit reserved for the sign. 好吧,Two's complement 的情况并不完全正确。在Two's complement中,所有位代表一个值,没有符号位。
  • @Lundin,当我包含 stdio.h 头文件警告消失但 x 的输出在没有头文件的情况下首先更改 x 的值现在与 stdio.h 头文件的值变为 -4 x 变为 -2。为什么会这样??
  • @SahilAggarwal 当您不包含 stdio.h 时,您的旧 C90 编译器可能会假定类型为 int 或其他类型。不要使用 C90(或 gnu90),它是老废话。 gcc -std=c11.
  • @Lundin,我只使用 C gcc 编译器,不使用旧的 turbo 编译器。
猜你喜欢
  • 2017-01-15
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 2023-03-26
  • 2019-05-14
  • 2011-04-20
  • 1970-01-01
相关资源
最近更新 更多