如何正确使用unsigned int?unsigned int sub(int num1, int num2);当用户输入a小于时,我的功能不起作用b.如果我只是使用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));
}
Run Code Online (Sandbox Code Playgroud)
输出:
sub(7,4) = 3
sub(4,7) = 4294967293
Run Code Online (Sandbox Code Playgroud)
无符号数字是无符号的 ...这意味着它们不能为负数.相反,他们包裹(下溢或溢出).
如果你有8位无符号的实验,然后就可以看到减去的效果1来自0:
#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;
}
Run Code Online (Sandbox Code Playgroud)
i: 1
i: 0
i: 255
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
i: 4
i: 4294967293
Run Code Online (Sandbox Code Playgroud)
4294967293是有效的0 - 3,包装2^32 - 3.
您还需要注意将整数值(sub()函数的返回类型)赋值给float...通常这是要避免的.
见下文.x()返回4294967293为unsigned int,但它存储在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;
}
Run Code Online (Sandbox Code Playgroud)
y: 4294967296.000000
Run Code Online (Sandbox Code Playgroud)
这实际上与...的精度有关float.不可能将绝对值存储4294967293在a中float.
| 归档时间: |
|
| 查看次数: |
263 次 |
| 最近记录: |