c语言编程无符号数做减法,c - 无符号整数减法是否定义了行为?

使用无符号类型时,会发生模运算(也称为“环绕”行为)。 要理解这种模块化算法,只需看看这些时钟:

dwEaq.png

9 + 4 = 1(13 mod 12),所以另一个方向是:1 - 4 = 9(-3 mod 12)。 使用无符号类型时应用相同的原则。 如果结果类型为unsigned,则进行模运算。

现在看一下将结果存储为abs()的以下操作:

unsigned int five = 5, seven = 7;

unsigned int a = five - seven; // a = (-2 % 2^32) = 4294967294

int one = 1, six = 6;

unsigned int b = one - six; // b = (-5 % 2^32) = 4294967291

如果要确保结果为abs(),则将其存储到signed变量中或将其转换为signed.如果要获取数字之间的差异并确保不应用模运算,则应考虑使用 abs()函数在stdlib.h中定义:

int c = five - seven; // c = -2

int d = abs(five - seven); // d = 2

要非常小心,特别是在写条件时,因为:

if (abs(five - seven) < seven) // = if (2 < 7)

// ...

if (five - seven < -1) // = if (-2 < -1)

// ...

if (one - six < 1) // = if (-5 < 1)

// ...

if ((int)(five - seven) < 1) // = if (-2 < 1)

// ...

if (five - seven < 1) // = if ((unsigned int)-2 < 1) = if (4294967294 < 1)

// ...

if (one - six < five) // = if ((unsigned int)-5 < 5) = if (4294967291 < 5)

// ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值