首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么未签名的4不被认为大于签名-2?

为什么未签名的4不被认为大于签名-2?
EN

Stack Overflow用户
提问于 2017-11-17 13:22:32
回答 3查看 848关注 0票数 5
代码语言:javascript
复制
unsigned int x = 4;
int y = -2; 
int z = x > y; 

在实现此操作时,变量Z的值为0,但为什么为0而不是1?

EN

回答 3

Stack Overflow用户

发布于 2017-11-17 13:23:32

信不信由你,如果C表达式是由两个参数组成的,一个参数具有int类型,另一个参数具有unsigned类型,那么在进行比较之前,int值将被提升为unsigned类型。

因此,在您的示例中,y被提升为unsigned类型。因为它是负的,所以它将通过将UINT_MAX + 1添加到它来转换,并且它将假定一个值UINT_MAX - 1

因此,x > y将为0。

是的,这就是的原因--很多bug。即使是专业的程序员也会时不时地爱上这一点。一些编译器可以警告您:例如,对于gcc,如果使用-Wextra进行编译,就会收到警告。

票数 8
EN

Stack Overflow用户

发布于 2017-11-17 13:27:05

这是算术转换的结果。

在表达式x > y中,您有一个int操作数和一个unsigned int操作数。y被提升为unsigned int,并且通过向y的值添加比最大unsigned int值多一个的值来转换值。

涵盖算术转换的C标准第6.3.1.8节规定如下:

许多期望算术类型操作数的操作符会以类似的方式导致转换和生成结果类型。其目的是为操作数和结果确定一个公共的实类型。对于指定的操作数,每个操作数都在不改变类型域的情况下转换为其对应的实类型为公共实类型的类型。除非另有明确说明,否则,公共实类型也是结果的对应实类型,如果操作数相同,则其类型域是操作数的类型域,否则是复杂的。这种模式称为通常的算术转换。 ..。 否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数类型的秩,则带符号整数类型的操作数转换为无符号整数类型的操作数类型。

因此,现在y是一个非常大的值,而x是4。由于x小于这个值,x > y计算为false,后者的值为0。

票数 2
EN

Stack Overflow用户

发布于 2017-11-17 13:24:13

它被称为整数提升。

代码语言:javascript
复制
int z = x > y; 

在本例中,比较(>)运算符signed intunsigned int进行操作。根据转换规则,y被转换为无符号int。因为-2不能表示为无符号int值,所以-2被转换为-2 + UINT_MAX+1

C11 6.3.1.3,第2款:

否则,如果新类型没有符号,则通过重复添加或减去比新类型中可以表示的最大值多一个值来转换值,直到该值位于新类型的范围内为止。

因此,程序打印0,因为UINT_MAX不少于4

如果要打印1,则执行显式类型大小写。像这样:

代码语言:javascript
复制
int z =  (int)x >y; 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47351654

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档