【发布时间】: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