【问题标题】:why is 00000000 - 00000001 = 11111111 in C unsigned char data type? [duplicate]为什么 00000000 - 00000001 = 11111111 在 C unsigned char 数据类型中? [复制]
【发布时间】:2020-02-05 14:19:20
【问题描述】:

我观察到,当 unsigned char 变量存储值 0 (000000002) 并减 1 (000000012) 时,变量值变为255 (111111112),这是 unsigned char 变量可以容纳的最大值。

我的问题是:为什么 000000002 - 000000012 变成 111111112? (我想看看它背后的算法)

我观察到的 C 代码是这个:

#include <stdio.h>

main(){

  unsigned char c = 0;

  unsigned char d = c - 1;

  printf("%d\n%d", c, d);

}

运行时显示如下输出:

0
255

【问题讨论】:

  • 它被称为模运算,它是处理无符号数的一种相当合理的方法。同样的原因,“从 00:00 减去 1 小时”的答案会给你“23:00”,而不是“-01:00”。
  • 你知道当一个六位数的汽车里程表从 999999 持续到 000000 时是怎么回事吗?如果它从 000000 向后退,它将转到 999999。二进制从 00000000 到 11111111 是同样的事情。
  • 详细来说,从右到左处理数字:首先我们有0减去1:1更大,所以我们从左边的数字“借”1。然后我们有 10 减去 1,结果为 1。在下一个位置,我们有 0 减去 0 减去借位 1,所以它是 0 减去 1。同样,我们借位并得到 1。这一直持续到最后一个位置,我们再次借用 1 并得到 1。现在我们有 8 个 1 作为结果位和从左边的位置借位,它在 8 位之外,被丢弃或忽略。
  • 你期待什么?
  • @samuel:嗯,0 不够借,所以你从左边借 1。这使它成为 10,您可以从中减去 1。在我写的时候,一直到最后一位,我们已经借了 100000000(十进制的 256)。即,我们有 1 0000 0000 - 0000 0001,而不是 0000 0000 - 0000 0001,这显然是 1111 1111。它只有在允许你借到你没有的 1 0000 0000 时才有效。这与工作模 256 相同。

标签: c binary char unsigned-char


【解决方案1】:

here:

无符号整数运算总是模 2n 其中 n 是 该特定整数中的位数。例如。对于无符号整数, 对UINT_MAX 加一得到​0​,从​0​ 中减一得到 UINT_MAX.

因此,在您的示例中,由于 unsigned char 通常是 8 位,因此您得到 28-1 = 255。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-19
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    相关资源
    最近更新 更多