首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么整数推广的结果是不同的?

问为什么整数推广的结果是不同的?
EN

Stack Overflow用户
提问于 2011-10-10 09:57:46
回答 2查看 2.3K关注 0票数 15

请看我的测试代码:

代码语言:javascript
复制
#include <stdlib.h>
#include <stdio.h>


#define PRINT_COMPARE_RESULT(a, b) \
    if (a > b) { \
        printf( #a " > " #b "\n"); \
    } \
    else if (a < b) { \
        printf( #a " < " #b "\n"); \
    } \
    else { \
        printf( #a " = " #b "\n" ); \
    }

int main()
{
    signed   int a = -1;
    unsigned int b = 2;
    signed   short c = -1;
    unsigned short d = 2;

    PRINT_COMPARE_RESULT(a,b);
    PRINT_COMPARE_RESULT(c,d);

    return 0;
}

结果如下:

代码语言:javascript
复制
a > b
c < d

我的平台是Linux,我的gcc版本是4.4.2。我对第二行的产出感到惊讶。输出的第一行是由整数提升引起的。但是为什么第二行的结果不同呢?

以下规则来自C99标准:

如果两个操作数都具有相同的类型,则不需要进一步的转换。否则,如果两个操作数都具有有符号整数类型或都具有无符号整数类型,则具有较小整数转换秩类型的操作数将转换为级别较大的操作数类型。 否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数类型的秩,则带符号整数类型的操作数转换为无符号整数类型的操作数类型。 否则,如果带符号整数类型的操作数的类型可以用无符号整数类型表示操作数类型的所有值,则具有无符号整数类型的操作数转换为带符号整数类型的操作数类型。 否则,两个操作数都转换为与带符号整数类型的操作数类型对应的无符号整数类型。

我认为这两种比较应该属于同一种情况,即整数提升的第二种情况。

EN

回答 2

Stack Overflow用户

发布于 2011-10-10 23:27:31

摘自C++标准:

4.5积分促销conv.prom 1如果int可以表示源类型的所有值,则可以将char、符号char、无符号char、空int或无符号短int的r值转换为int类型的rvalue;否则,可以将源rvalue转换为无符号int类型的rvalue。

在实践中,这意味着所有操作(在列表中的类型上)实际上都是在类型int上计算的,如果它能够覆盖您所处理的整个值集,否则它将在unsigned int上执行。在第一种情况下,将值作为unsigned int进行比较,因为其中之一是unsigned int,这就是为什么-1“大于”2的原因。在第二种情况下,值a比较为有符号整数,因为int涵盖了short和unsigned short的整个区域,而so -1小于2。

(背景故事:实际上,以这种方式涵盖所有情况的所有复杂定义都导致编译器实际上可以忽略(!):后面的实际类型,而只关心数据大小。)

票数 1
EN

Stack Overflow用户

发布于 2016-08-10 00:09:52

C++的转换过程被描述为常用算术变换。然而,我认为最相关的规则是在子引用的部分conv.prom:整体促销4.6.1。

整数转换秩( char16_t )小于int的整数类型( bool、char16_t、char32_t或wchar_t )以外的整数类型的prvalue可以转换为int类型的prvalue,如果int可以表示源类型的所有值;否则,源prvalue可以转换为类型为无符号int的prvalue。

有趣的是使用"can“一词,我认为这表明这种推广是由编译器自行决定的。

我还发现了这 C-spec代码片段,它暗示没有进行升级:

代码语言:javascript
复制
11   EXAMPLE 2       In executing the fragment
              char c1, c2;
              /* ... */
              c1 = c1 + c2;
     the ``integer promotions'' require that the abstract machine promote the value of each variable to int size
     and then add the two ints and truncate the sum. Provided the addition of two chars can be done without
     overflow, or with overflow wrapping silently to produce the correct result, the actual execution need only
     produce the same result, possibly omitting the promotions.

还有需要考虑的“等级”的定义。规则的清单相当长,但由于它适用于这个问题,“排名”很简单:

任何无符号整数类型的秩应等于相应有符号整数类型的秩。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7711124

复制
相关文章

相似问题

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