变量越来越大,但结果却是最小的?

时间:2015-07-06 23:18:34

标签: objective-c loops for-loop

我正在研究Objective-C。今天,我遇到了一个问题:

  

在Mac上,short是2字节整数,一位用于保存   标志。短线可以存储的最小数量是多少?是什么   最大?

下面是我的代码,我对循环有疑问。在For循环中,x从0变大,如1,2,3,4,5 .....,但最终结果是-32768。 我无法弄清楚为什么结果是负数。与最大的问题相同。

      //Resize widget on handler click
      var height;
      function handler1() {
          height = $(this).parent().parent().attr( "data-sizey" );
         // console.log(height, "Height");
          gridster.resize_widget($(this).parent().parent(), 0, 1);
          $(this).toggleClass('arrow_rotate');
          $(this).parent().parent().toggleClass('minimized');
          $(this).one("click", handler2);
        }

        function handler2() {
            gridster.resize_widget($(this).parent().parent(), 0, height);
            $(this).toggleClass('arrow_rotate');
            $(this).parent().parent().toggleClass('minimized');
            $(this).one("click", handler1);
        }
        $(".minimize").one("click", handler1);

2 个答案:

答案 0 :(得分:3)

不幸的是,这是未定义的行为。 C规范中未定义行为的第一个示例是

  

未定义行为的一个示例是整数溢出的行为。 C11dr§3.4.33

两个for循环都会产生这种未定义的行为。 智能编译器可以识别并将for (x = 0; x > -1; x++) { continue; }更改为for (;;) {; },无限循环或;(无)。

for (x = 0; x > -1; x++) {
  continue;
}
for (y = 0; y < 1; y--) {
  continue;
}

所以一切皆有可能。代码可以使用以下内容,但这可能不是本练习的内容。

#include <limits.h>
printf("Smallest short is %d. \n", SHRT_MIN);
printf("Largest short is %d. \n", SHRT_MAX);

答案 1 :(得分:0)

因为溢出。

带符号的2字节整数可由以下16位表示:

00000000 00000000

其中第一位是符号位(0表示正数,1表示负数)。递增时,最终会达到01111111 11111111(最大正整数)并再次递增以获得1000000 000000(最大负整数)。有关为何以这种方式格式化位,请参见2's complement