首页 文章

signed / unsigned int mismatch

提问于
浏览
2

以下程序给出了签名/未签名的不匹配警告:

#include <iostream>

int main()
{
unsigned int a = 2;
int b = -2;

if(a < b)
    std::cout << "a is less than b!";

return 0;
}

我想在混合有符号和无符号的整数时理解这个问题 . 根据我的说法,int通常使用二进制补码存储在内存中 .

所以,假设我有数字2.根据我的理解,它将在内存中表示如下:

00000000 00000000 00000000 00000010

-2将表示为一个人的赞美加1,或者:

11111111 11111111 11111111 11111110

有了两个赞美,没有像“符号和幅度方法”那样保留标志 . 如果没有符号位,为什么无符号整数能够存储更大的正数?混合有符号/无符号整数时可能出现的问题示例是什么?

5 回答

  • 5

    在混合有符号和无符号的整数时,我试图理解这个问题 .

    a < b

    通过通常的算术转换 b 被转换为 unsigned int ,这是一个巨大的数字 > a .

    这里的表达式 a < b 与以下内容相同:

    2U < (unsigned int) -2 与以下相同:

    2U < UINT_MAX - 1 (在大多数两个补码系统中) 1 (真) .

    有两个赞美,没有像“符号和幅度法”那样保留标志 .

    在二进制补码表示中,如果有符号数量的最高有效位为 1 ,则该数字为负数 .

  • 0

    2 147 483 648的代表是什么?

    10000000 00000000 00000000 00000000
    

    -2 147 483 648的代表是什么?

    10000000 00000000 00000000 00000000
    

    相同!因此,您需要一个约定来了解差异 . 惯例是第一位仍然用于决定符号,只是不使用你原本使用的天真符号量值方法 . 这意味着每个正数都以0开头,实际数字只剩下31位 . 这给出了无符号数的正范围的一半 .

    您的代码存在的问题是有符号整数将转换为无符号整数 . 例如,-1将变为4 294 967 295(它们具有相同的二进制表示),并且将远大于零,而不是更小 . 这可能不是你所期望的 .

  • -2

    int 只能存储2 ^ 32个不同的值(如果它是32位),无论是 signed 还是 unsigned . 因此 signed int 具有低于零的范围的1/2,并且该范围的1/2高于零 . unsigned int 具有零以上的全范围 .

    虽然他们没有调用 signed int 'sign bit'的最重要部分,但可以这样对待 .

  • 0

    这不像(int)a <int(b)???你是否需要强烈进行显式类型转换?

  • 1

    好吧,-1作为signed int是-1而unsigned int是65534,所以问题在于带符号值,其中需要“ - ” . 如果返回-1错误代码,使用unsigned int将是65534代码 .

相关问题