【问题标题】:Difference in implementation of signed and unsigned integers C++有符号和无符号整数 C++ 实现的区别
【发布时间】:2017-06-07 20:17:14
【问题描述】:

我知道两个补码表示。我想知道在int 和unsigned int 之间的实施方面有什么具体区别。我会这么说

  1. 比较不同(符号位会改变比较的执行方式)。
  2. 乘法不同(我取模,将这些模块相乘,然后根据两个操作数的符号对结果求补)。
  3. 除法不同(乘法原因相同)。
  4. 加法和减法看起来一样

还有其他我可能不知道的差异吗?

【问题讨论】:

  • 由于您专门标记了 C++,unsigned int“环绕”,但对于 signed ints,溢出是未定义的行为。
  • 我认为它们之间的唯一区别是,int 是二进制补码,unsigned int 不是二进制补码,所以 int 中的 2^31 是负数,但 2^31 中unsigned int 是一个正数,对于 int 和 unsigned int 中小于 31 的幂,所有位都是正数
  • 有符号整数用于表示负数和正数,因此有符号整数的取值范围:-2147483648 到 2147483647 无符号:0 到 4294967295。有符号整数使用二进制补码表示负值。例如 8 位有符号值 (-1) 表示为 1111 1111。接下来的规则用于负值表示:000 0001( 反转 ) -> 1111 1110( 加一 )-> 1111 1111
  • 看here和here

标签: c++ integer implementation


【解决方案1】:

我假设两个补码算术,因为这是最常见的。

有很多关于二进制补码算术的解释。例如,cmets 中的链接,这里用于乘法:http://pages.cs.wisc.edu/~smoler/cs354/beyond354/int.mult.html

1:正确。比较通常以与减法相同的方式实现 - 但减法的结果被丢弃,仅使用状态位。挑剔:“”是不同的,但“==”和“!=”是一样的。

2, 3:是的,乘法和除法是不同的。

4:嗯,有点。结果的位模式是相同的,但有重要的区别。典型处理器上的加/减指令设置溢出、进位、负数和零的状态标志。所以我认为不同之处在于你如何解释结果而不是结果本身。这些状态位对 C/C++ 程序不可用,但由编译器生成的代码使用。

5:扩展。投射到更广泛的类型是不同的。对于无符号积分,它们是“零扩展的”,而对于有符号积分,它们是“符号扩展的”。符号扩展意味着它会复制窄类型的高位(符号位)来填充宽类型的附加位。

6:范围:例如,无符号 8 位值的范围是 0...255,而有符号 8 位值的范围是 -128...+127。

7:按位运算“&”、“|”、“~”和“^”是一样的

8:位移操作“>”:左移相同,但右移不同,因为有符号值右移做符号扩展。

【讨论】:

    猜你喜欢
    • 2011-08-10
    • 1970-01-01
    • 2015-01-24
    • 1970-01-01
    • 1970-01-01
    • 2013-10-02
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    相关资源
    最近更新 更多