Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 变量越来越大,但结果是最小的数?_Objective C_Loops_For Loop - Fatal编程技术网

Objective c 变量越来越大,但结果是最小的数?

Objective c 变量越来越大,但结果是最小的数?,objective-c,loops,for-loop,Objective C,Loops,For Loop,我目前正在学习Objective-C。今天,我遇到了一个问题: 在Mac上,short是2字节整数,一位用于保存 签名一个空头能储存的最小数字是多少?问题是什么 最大的 下面是我的代码,我有一个关于循环的问题。在For循环中,x从0开始变大,如1,2,3,4,5…,但最终结果是-32768。 我不明白为什么结果是负数。最大的那个也有同样的问题 short x; short y; for (x = 0; x > -1; x++) { continue; } printf("Smal

我目前正在学习Objective-C。今天,我遇到了一个问题:

在Mac上,short是2字节整数,一位用于保存 签名一个空头能储存的最小数字是多少?问题是什么 最大的

下面是我的代码,我有一个关于循环的问题。在For循环中,x从0开始变大,如1,2,3,4,5…,但最终结果是-32768。 我不明白为什么结果是负数。最大的那个也有同样的问题

short x;
short y;

for (x = 0; x > -1; x++) {
    continue;
}
printf("Smallest short is %d. \n",x);

for (y = 0; y < 1; y--) {
    continue;
}
printf("Largest short is %d. \n",y);
short x;
短y;
对于(x=0;x>-1;x++){
继续;
}
printf(“最小短路为%d.\n”,x);
对于(y=0;y<1;y--){
继续;
}
printf(“最大短路为%d.\n”,y);
因为溢出

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

00000000000000


其中第一位是符号位(
0
表示正,
1
表示负)。当您递增时,最终将达到
01111111111
(最大的正整数)并再次递增以获得
10000000000
(最大的负整数)。请参见为什么位以这种方式格式化。

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

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

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

(x=0;x>-1;x++)的
{
继续;
}
对于(y=0;y<1;y--){
继续;
}
所以一切皆有可能。代码可以使用以下内容,但这可能不是本练习的内容

#include <limits.h>
printf("Smallest short is %d. \n", SHRT_MIN);
printf("Largest short is %d. \n", SHRT_MAX);
#包括
printf(“最小短路为%d.\n”,SHRT_MIN);
printf(“最大短路为%d.\n”,SHRT_MAX);
#include <limits.h>
printf("Smallest short is %d. \n", SHRT_MIN);
printf("Largest short is %d. \n", SHRT_MAX);