如何正确使用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));
}
输出:
sub(7,4) = 3
sub(4,7) = 4294967293
答案 0 :(得分:6)
无符号数无符号 ...这意味着 不能为负数。 相反,他们包裹(下溢或溢出)。
如果您使用8位无符号进行实验,则可以看到从A = number;
B = '20';
tf = strcmp(A,B)
中减去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;
}
i: 1
i: 0
i: 255
是8位无符号可容纳的最大值(255
)。
然后,我们可以使用您的2^8 - 1
对32位无符号进行相同的实验:
4 - 7
#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()
作为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;
}
这实际上与y: 4294967296.000000
的精确度有关... ...无法将绝对值float
存储在4294967293
中。
答案 1 :(得分:2)
unsigned int
不能用于表示负变量。我相信你想要的是找到a
和b
之间差异的绝对值。如果是这样,您可以使用abs()
中的stdlib.h
功能。 abs()
函数接收int
变量i
并返回i
的绝对值。
unsigned int
在您的情况下返回一个巨大数字的原因是由于整数在系统中的表示方式。您将diff
声明为int
类型,它能够存储负值,但在解释为-3
时代表unsigned int
的相同位序列表示{{1相反。
答案 2 :(得分:2)
您看到的内容称为无符号整数溢出。如您所述,无符号整数不能保留负数。因此,当你尝试做一些会导致负数的事情时,看似奇怪的事情就会出现。
如果使用32位整数,
int32_t
)可以保存(-2 ^ 31)和(+ 2 ^ 31-1),INT_MIN
和INT_MAX
uint32_t
)可以保存(0)到(2 ^ 32-1),UINT_MIN
和UINT_MAX
当你尝试向int添加一些会导致数字大于类型可以容纳的数字时,它会溢出。
答案 3 :(得分:0)
它变为负数,无符号数据类型不保持负数,因此它变为大数
答案 4 :(得分:0)
“a和b之间差异的绝对值”对[2017-04-18 11:55:56,039] [] INFO - HTTPSender Unable to sendViaPost to url[https://10.1.2.68:9443/services/AuthenticationAdmin]
java.net.ConnectException: Connection refused: connect
at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:589)
at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:649)
at org.opensaml.ws.soap.client.http.TLSProtocolSocketFactory.createSocket(TLSProtocolSocketFactory.java:193)
at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707)
at org.apache.commons.httpclient.MultiThreadedHttpConnectionManager$HttpConnectionAdapter.open(MultiThreadedHttpConnectionManager.java:1361)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387)
at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
at org.apache.axis2.transport.http.AbstractHTTPSender.executeMethod(AbstractHTTPSender.java:659)
at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:195)
at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:77)
at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:451)
...
的许多组合不起作用。任何溢出的a,b
都是未定义的行为。显然a-b
无法生成正确的答案。
此外,使用abs(INT_MAX - INT_MIN)
使用选择值abs()
调用未定义的行为。当int
无法表示为abs(INT_MIN)
时,-INT_MIN
是未定义的行为。
要计算2 int
的绝对值差值,请将它们减去int
。
unsigned