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

时间:2017-04-18 14:26:48

标签: 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));
}

输出:

sub(7,4) = 3
sub(4,7) = 4294967293

5 个答案:

答案 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() ...通常这是要避免的。

见下文。 floatx()作为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不能用于表示负变量。我相信你想要的是找到ab之间差异的绝对值。如果是这样,您可以使用abs()中的stdlib.h功能。 abs()函数接收int变量i并返回i的绝对值。

unsigned int在您的情况下返回一个巨大数字的原因是由于整数在系统中的表示方式。您将diff声明为int类型,它能够存储负值,但在解释为-3时代表unsigned int的相同位序列表示{{1相反。

答案 2 :(得分:2)

您看到的内容称为无符号整数溢出。如您所述,无符号整数不能保留负数。因此,当你尝试做一些会导致负数的事情时,看似奇怪的事情就会出现。

如果使用32位整数,

  • int(int32_t)可以保存(-2 ^ 31)和(+ 2 ^ 31-1),INT_MININT_MAX
  • 之间的数字
  • unsigned int(uint32_t)可以保存(0)到(2 ^ 32-1),UINT_MINUINT_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