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