【问题标题】:Comparison of signed int and unsigned short in c++c++中signed int和unsigned short的比较
【发布时间】:2017-10-16 17:54:59
【问题描述】:

我知道,当我们比较有符号和无符号时,编译器会将我们的有符号值转换为无符号值,而当我们将 short 与 int 进行比较时,编译器会将较小的类型转换为较大的类型。但是我写了这段代码来检查我们是否比较了有符号的 int x=0xdeadbeef 和 unsigned short y=0xffff,然后在将 unsigned short 转换为 int 之后,在比较时我们应该在 y 中有 0x0000ffff,它应该小于 x 的无符号值。但是我的代码没有进入 x 大于 y 的 if 条件。谁能给我解释一下为什么?

代码片段:

#include<iostream>
using namespace std;

int main (){

        unsigned int x=0xDEADBEEF;
        unsigned short y= 0xFFFF;

        if((signed)x > y)
                cout<<"X is larger"<<endl;

  return 0;
}

运行时代码不会打印“X is large”。

【问题讨论】:

  • 因为 (signed)x 是负数。
  • 但是当将无符号与有符号进行比较时,编译器不应该将其转换回无符号吗?
  • 顺便说一句,您的代码在 C++
  • 因为0xDEADBEEF 不能用 32 位 int 表示,所以结果是实现定义的 - 在这种情况下为负数。它小于 any unsigned short 值 - 在比较之前 unsigned short 被提升为 int
  • 我不明白为什么 0xdeadbeef 不能用 32 位无符号整数表示。未签名时怎么可能是负数?

标签: c++ unsigned signed


【解决方案1】:

当您将x 从无符号类型转换为有符号时,会导致整数溢出。请注意,signed int 可以保持比unsigned int 更小的正值。因此,当整数溢出发生时,在大多数平台上,它开始像汽车的里程表一样工作。即一旦 int 值超过它可以存储的最大值,它就会从头开始。在 32 位系统 (int32) 上签名 int 的“开始”将是 -2,147,483,648

因此,在您的情况下,x 是 0xDEADBEEF 或 3,735,928,559。 32 位系统上的 unsigned int 可以存储此值。但是,当它类型转换为 signed 时,会导致溢出,因此上述规则适用并将该值转换为 -1,588,444,912。由于它是否定的,您在 if 语句中的条件不满足,因此您的语句永远不会被打印。

【讨论】:

    猜你喜欢
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-13
    相关资源
    最近更新 更多