在这种情况下,sizeof(int)返回什么?

4
#include<stdio.h>
#include<conio.h>

void main()
{   
    if(sizeof(int)>=-2)    
        printf("True");
    else
        printf("False");
}

当我尝试使用Turbo C ++编译此代码时,它返回False而不是True。 但是,当我尝试打印int值时,程序返回2。
这怎么可能?因为sizeof(int)返回2,而且是2> = -2。

9
你为什么使用 TurboC++?它已经不再维护,而且不符合标准规范...可以尝试使用GCC(http://gcc.gnu.org/),例如在Linux系统上。 - Basile Starynkevitch
5
整数提升规则。 - jrok
1
可能是 sizeof 运算符的返回类型是什么?的重复问题。 - eerorika
2
在C++程序中,main 函数中的 return 0 不是必需的。 - jrok
1
在 C++ 中,main 函数中不需要使用 return 0 - juanchopanza
显示剩余8条评论
2个回答

16

sizeof(int)被替换为类型std::size_t,它是无符号的,在大多数实现中适用。

由于有符号整数会被提升为无符号整数,因此将有符号整数与无符号整数进行比较会导致奇怪的结果。

您可以像下面展示的那样获得明智的结果:

if(static_cast<int>(sizeof(int)) >= -2)

如果您正在开发一个C编译器

if((int)sizeof(int) >= -2)

使用一些警告标志,例如-Wall来编译您的代码,应该会警告有关已签名/未签名比较的内容。(如果您没有忽略警告)


5
问题不在于一个好的编译器。 - Mike Seymour
3
标准要求std::size_t必须是一个无符号类型。 - James Kanze
请你帮我重写一下代码,让它返回 true。提前感谢你。 - Abdul
@JamesKanze 谢谢。 - Gyapti Jain
1
如果使用if(1)也可以得到合理的结果,因为sizeof永远不会返回负值。 - M.M
显示剩余2条评论

2
< p > sizeof 的类型是 size_ttypedef unsigned int size_t)。unsigned int 与有符号数比较可能导致错误的答案。


1
不一定是 unsigned intunsigned longunsigned long long 可能更常见。唯一的要求是它必须是无符号整数类型。 - James Kanze
请你帮我重写一下代码,让它返回 true。提前感谢你。 - Abdul
在64位系统上,最可能是“unsigned long”或“unsigned long long”。 - phuclv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接