一种奇怪的行为。
#include<stdio.h>
#include <stdbool.h>
int main()
{
int x = sizeof(int) > -1;
bool z = sizeof(int);
printf("x is %d \t z is %d \n",x,z);
if(sizeof(int)>-1)
{
printf("true\n");
}
else
printf("false\n");
}
当 sizeof(int)> -1 为true并且预期输出应为1时,为什么int x为零。
答案 0 :(得分:4)
GCC编译器警告说:
prog.c: In function 'main': prog.c:6:21: warning: comparison of integer expressions of different signedness: 'long unsigned int' and 'int' [-Wsign-compare] int x = sizeof(int) > -1; ^ prog.c:11:15: warning: comparison of integer expressions of different signedness: 'long unsigned int' and 'int' [-Wsign-compare] if(sizeof(int)>-1)
因此,您正在比较signed int
和unsigned long int
。将-1
转换为unsigned long int
时,结果是最大可能的unsigned long int
值(与ULONG_MAX
相同)。
C $ 6.3.1.3,第2段:
否则,如果新类型为
unsigned
,则将值转换为 重复加或减一个比最大值大 可以用新类型表示,直到该值在 新类型。
有关更多信息,请阅读cppreference。
答案 1 :(得分:1)
sizeof
运算符不会产生int
,而会产生size_t
,这是一个无符号整数类型。当您将-1之类的有符号整数与无符号整数进行比较时,最终将比较错误的值。
进行以下更改,代码将按预期工作。
#include<stdio.h>
#include <stdbool.h>
int main()
{
int x = (int)sizeof(int) > -1;
bool z = sizeof(int);
printf("x is %d \t z is %d \n",x,z);
if((int)sizeof(int) > -1)
{
printf("true\n");
}
else
printf("false\n");
}
输出:
x is 1 z is 1
true
答案 2 :(得分:0)
sizeof
运算符返回类型size_t
size_t
类型是无符号类型。通常是unsigned int
如果将unsigned int
与-1
进行比较,然后按照整数提升规则(Signed to unsigned conversion in C - is it always safe?),则它们都将转换为无符号。
因此-1
将转换为65535,等式4>65535
将得到零。
答案 3 :(得分:-1)
有符号和无符号整数类型(包括char
)之间的区别在于,负值由设置为1的最高有效位表示。在大多数平台上,这种情况下的大小由二进制补码表示。例如。为char
:
10000001:-(1)0000000 * 01111111 = -127
我们应该将00000001减去1,然后将除符号外的所有位取反,以得到该值。
现在,在比较期间,如果其他参数是无符号的,则将有符号的值视为无符号的。有历史和实际原因,例如避免在编译旧版代码时在字符比较中产生歧义。传统上,C中的所有字符串都是char *而不是无符号char *。
10000001,因为无符号字符等于129。
因此,根据此程序-1大于1。
#include <iostream>
int a = -1;
unsigned int b = 1;
int main(int argc, char** argv)
{
if(b < a) std::cout << "The world is mad.\n";
if(a > b) std::cout << "Yes, it is.\n";
return 0;
}
您始终应该注意有关比较以及“可能的数据丢失”的警告。这些是程序中非常常见的错误来源。