为什么这两个程序在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];
}