Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.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
为什么这两个程序在ANSI C中的行为不同?_C - Fatal编程技术网

为什么这两个程序在ANSI C中的行为不同?

为什么这两个程序在ANSI C中的行为不同?,c,C,可能重复: 一, main() { 如果(-1对于第一个字符,右边是一个无符号字符,并且所有无符号字符值都适合一个有符号整数,那么它将转换为有符号整数 对于第二个,右侧是无符号int,因此左侧从有符号int转换为无符号int 另请参见。starblue解释了问题的第一部分。我将回答第二部分。因为TOTAL\u ELEMENTS是一个size\u t,它是无符号的,int被转换为无符号类型。您的size\u t是这样的,int不能代表它的所有值,所以int到size\u t的转换>发生,而不是s

可能重复:

一,

main()
{

如果(-1对于第一个字符,右边是一个无符号字符,并且所有无符号字符值都适合一个有符号整数,那么它将转换为有符号整数

对于第二个,右侧是无符号int,因此左侧从有符号int转换为无符号int


另请参见。

starblue解释了问题的第一部分。我将回答第二部分。因为
TOTAL\u ELEMENTS
是一个
size\u t
,它是无符号的,int被转换为无符号类型。您的size\u t是这样的,int不能代表它的所有值,所以
int
size\u t
的转换>发生,而不是
size\u t
int

负数到无符号数的转换是完全定义的:该值是环绕的。如果将
-1
转换为
无符号整数
,它将在
UINT\u MAX
处结束。无论是否使用两个补码来表示负数,这都是正确的


本文档提供了有关保值转换的更多信息。

以下是我记忆如何应用自动转换的方法:

  • 如果操作数大小不同,则将转换应用于较小的操作数,使其与较大的操作数类型相同(如果较小的操作数有符号,则使用符号扩展)

  • 如果操作数大小相同,但一个有符号,另一个无符号,则有符号操作数将转换为无符号操作数


虽然上述可能并非适用于所有实现,但我相信它适用于所有两个补码实现。

在第二个代码示例中,您的意思是“array”而不是“array”?另请参见类似问题。
main()
{

 if(-1<(unsigned char)1)
     printf("-1 is less than (unsigned char)1:ANSI semantics");
 else
     printf("-1 NOT less than (unsigned char)1:K&R semantics");
}
int array[] = {23,41,12,24,52,11};
#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0]))
main()
{
    int d = -1,x;
    if(d<=TOTAL_ELEMENTS -2)
        x = array[d+1];
}