为什么sizeof类型与整数比较返回false

时间:2018-09-28 05:42:01

标签: c gcc

我在下面的代码中发现了

一种奇怪的行为。

#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为零。

4 个答案:

答案 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 intunsigned 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;
}

您始终应该注意有关比较以及“可能的数据丢失”的警告。这些是程序中非常常见的错误来源。