c - 在 C 中使用无符号数据类型

标签 c int unsigned

如何正确使用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/

相关文章:

c - TCP 客户端/服务器打印额外的字符串

c++ - 从 double* 转换为 int 会失去精度

python - 对变量内容进行数字排序

c - 当从数组更改为数组 unsigned int 时,堆排序 C 不起作用

java - 如何在 Java 中将短片打印为无符号短片

c - 输入文本文件时文件无法正确输出

c++ - CMake 目标链接库 "Could NOT find GLUT (missing: GLUT_glut_LIBRARY)"

c++ - 了解负数并转换它们

c - 如何仅使用 C 列出和操作 Windows 文件?

python - 如何添加变量?