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

rei*_*mos 0 c int unsigned

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

Att*_*tie 6

无符号数字是无符号的 ...这意味着它们不能为负数.相反,他们包裹(下溢或溢出).

如果你有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()返回4294967293unsigned 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.

  • @reiallenramos`uint8_t`是一个无符号整数类型,正好是8位宽,由`#include <stdint.h>`定义.如果实现没有可用的类型,则它是可选的. (2认同)