2015-08-08 52 views
1

程序1:比较与负值的符号/无符号值之间

#include <stdio.h> 
int main() 
{ 
    if (sizeof(int) > -1) 
     printf("Yes"); 
    else 
     printf("No"); 
    return 0; 
} 

输出:No

计划2:

#include <stdio.h> 
int main() 
{ 
    if (2 > -1) 
     printf("Yes"); 
    else 
     printf("No"); 
    return 0; 
} 

输出:Yes

问题:

  1. 程序1和程序2有什么不同?
  2. 为什么sizeof(int)被认为是unsigned
  3. 为什么程序2中的2被认为是signed
+0

'2'是一个'signed int'文字。 '2u'将是'unsigned'。 –

回答

1

类型由操作者sizeof返回的值是size_t,其被指定为一个无符号的类型(通常相当于unsigned long)。

简单的纯整数常量,像2-1总是int类型的,和int签署。

如果你想要一个无符号的整数字面量,你必须添加U后缀,如2U

+0

“*和int有符号*” - 是不是实现定义是否'int'是'signed'或'unsigned'? –

+1

@CoolGuy Yoiu're正在考虑'char',所有其他整数类型都被签名。 –

+2

@Cool Guy @JoachimPileborg:或'int'位域。 – cremno

0

这是因为sizeof运算符返回size_t中的值。这应该是一个无符号类型,通常实现为unsigned int

编号2本身是int而不是unsigned int

2

这是常见的问题通常算术转换之间的有符号和无符号整数。 sizeof运算符返回size_t类型的值,即<stddef.h>(另请参阅this answer)中定义的一些实现定义的无符号整数类型。

整数常量-1的类型为int。当size_t被实现为“至少”unsigned int(这很可能发生在您的情况下),那么二元运算符<的两个操作数都将转换为无符号类型。无符号值不能为负值,因此-1会变成大数。

相关问题