Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C语言中使用无符号数据类型_C_Int_Unsigned - Fatal编程技术网

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

在C语言中使用无符号数据类型,c,int,unsigned,C,Int,Unsigned,如何正确使用unsigned int?我的函数unsigned int subint num1,int num2;当用户输入a小于b时不工作。如果我简单地使用int,我们可以得到一个否定的答案,我需要在减法之前确定哪个更大。我知道这很简单,但也许有一种方法可以使用unsigned int来避免这种情况 例如,当a=7和b=4时,答案是3.000000。但是当我翻转它们时,代码会给我4294967296.000000,我认为这是一个内存地址 #include <stdio.h> un

如何正确使用unsigned int?我的函数unsigned int subint 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));
}

它变为负数,无符号数据类型不包含负数,因此它变为一个大数字

无符号数是无符号的。。。这意味着它们不能是负面的。 相反,它们包裹着底流或溢流

如果使用8位无符号进行实验,则可以看到从0中减去1的效果:

包括 包括 int mainvoid{ uint8_t i; i=1; printfi:%hhu\n,i; i-=1; printfi:%hhu\n,i; i-=1; printfi:%hhu\n,i; 返回0; } i:1 i:0 i:255 255是8位无符号可容纳2^8-1的最大值

然后,我们可以使用您的4-7对32位无符号进行相同的实验:

包括 包括 int mainvoid{ uint32_t i; i=4; printfi:%u\n,i; i-=7; printfi:%u\n,i; 返回0; } i:4 i:4294967293 4294967293实际上是0-3,这将换行为2^32-3

您还需要小心将子函数的返回类型的整数值指定给浮点。。。一般来说,这是需要避免的

见下文。x返回4294967293作为无符号整数,但它存储在浮点中。。。然后将此浮点打印为4294967296

包括 包括 无符号整数xvoid{ 返回4294967293U; } int mainvoid{ 浮动y; y=x; 打印日期:%f\n,y; 返回0; } y:4294967296.000000 这实际上与浮点的精度有关。。。无法将绝对值4294967293存储在浮点中。

无符号int不能用于表示负变量。我相信你想要的是找到a和b之间差值的绝对值。如果是这样,您可以使用stdlib.h中的abs功能。abs函数接受一个int变量i并返回i的绝对值

在本例中,unsigned int返回一个巨大的数字的原因是系统中整数的表示方式。您将diff声明为int类型,该类型能够存储负值,但当解释为无符号int时,表示-3的相同位序列表示4294967296

您看到的称为无符号整数溢出。正如您所指出的,无符号整数不能包含负数。所以,当你试图做一些会导致负数的事情时,似乎奇怪的事情就会发生

如果使用32位整数

int int32_t可以保存介于-2^31和+2^31-1之间的数字,int_MIN和int_MAX 无符号整数uint32可以容纳0到2^32-1之间的数字,最小值和最大值
当您试图向int中添加某个值,该值将导致大于该类型所能容纳的数字时,它将溢出。

a和b之间差值的绝对值对a、b的许多组合不起作用。任何溢出的a-b都是未定义的行为。显然,absINT_MAX-INT_MIN不会生成正确的答案

另外,使用abs调用未定义的行为,选择值为int。当-int\u MIN不能表示为int时,absINT\u MIN是未定义的行为

要计算2 int的绝对值差,请将其作为无符号减去


从有符号转换为无符号不会导致取绝对值。这会导致转换。你希望从a=4,b=7的情况下得到什么?@Cornstalks啊,你是对的,绝对值必须是最好的方法。几乎所有发布的代码都不相关,相关的位取决于你没有显示的用户输入。至少说出你想要的输出。是的,unsigned意味着没有符号,这意味着它不能是负数。如果需要允许负值,则不能使用unsigned。出于兴趣,你认为这是什么意思?这是一个很好的信息,但它没有回答我的问题,所以我不能选择这个作为答案answer@reiallenramos你想要什么?要将一个无符号值打印为-3?@chux no,我想去掉-sign,这已经通过使用另一个值的abs解决了comments@reiallenramosabs也有它的优点,比如什么?出于我的目的,我只是坚持使用int声明,然后在函数定义中使用abs down。谢谢您的详细解释。我可以问一下标识符uint8\u t是什么类型吗?@reiallenramos uint8\u t是一种无符号整数类型,由include定义,宽度正好为8位。如果实现没有此类类型可用,则该选项是可选的。
sub(7,4) = 3
sub(4,7) = 4294967293
unsigned int abssub(int num1,int num2){
  return (num1 > num2) ? (unsigned) num1 - num2 : (unsigned) num2 - num1;
}