如何正确使用unsigned int?当用户输入 a
小于 b
时,我的函数 unsigned int sub(int num1, int num2);
不起作用。如果我简单地使用 int,我们可以期待一个否定的答案,我需要在减去之前确定哪个更大。我知道这很容易,但也许有一种方法可以使用 unsigned int 来避免这种情况?
例如,当 a
= 7 且 b
= 4 时,答案为 3.000000。但是当我翻转它们时,代码会给出 4294967296.000000,我认为这是一个内存地址。
#include <stdio.h>
unsigned int sub(int num1,int num2){
unsigned int diff = 0;
diff = num1 - num2;
return diff;
}
int main(){
printf("sub(7,4) = %u\n", sub(7,4));
printf("sub(4,7) = %u\n", sub(4,7));
}
输出:
sub(7,4) = 3
sub(4,7) = 4294967293
最佳答案
无符号数是无符号...这意味着它们不能为负数。 相反,它们会换行(下溢或溢出)。
如果你用 8 位无符号数做一个实验,那么你可以看到从 0
中减去 1
的效果:
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint8_t i;
i = 1;
printf("i: %hhu\n", i);
i -= 1;
printf("i: %hhu\n", i);
i -= 1;
printf("i: %hhu\n", i);
return 0;
}
i: 1
i: 0
i: 255
255
是 8 位无符号数可以容纳的最大值 (2^8 - 1
)。
然后我们可以使用您的 4 - 7
对 32 位无符号数进行相同的实验:
#include <stdio.h>
#include <stdint.h>
int main(void) {
uint32_t i;
i = 4;
printf("i: %u\n", i);
i -= 7;
printf("i: %u\n", i);
return 0;
}
i: 4
i: 4294967293
4294967293
实际上是 0 - 3
,它换行到 2^32 - 3
。
您还需要注意将整数值(sub()
函数的返回类型)分配给 float
...通常这是避免。
见下文。 x()
以 unsigned int
的形式返回 4294967293
,但它存储在 float
中……这 float
然后打印为 4294967296
???
#include <stdio.h>
#include <stdint.h>
unsigned int x(void) {
return 4294967293U;
}
int main(void) {
float y;
y = x();
printf("y: %f\n", y);
return 0;
}
y: 4294967296.000000
这实际上与float
的精度有关...不可能将绝对值4294967293
存储在float
中。
关于c - 在 C 中使用无符号数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43474945/