【问题标题】:C : Convert signed to unsignedC:将有符号转换为无符号
【发布时间】:2011-04-19 00:28:17
【问题描述】:

实际上,我(可能)遇到了一个“简单”的问题。所以我不知道如何将有符号整数转换为无符号整数。

我的代码:

signed int entry = 0;
printf("Decimal Number : ");
scanf("%d", &entry);
unsigned int uEntry= (unsigned int) entry;
printf("Unsigned : %d\n", uEntry);

如果我将无符号值发送到控制台(请参阅我的最后一行代码),我总是会返回一个有符号整数。

你能帮帮我吗?

非常感谢!

亲切的问候,亲

【问题讨论】:

    标签: c signed unsigned-integer


    【解决方案1】:
    printf("Unsigned : %u\n", uEntry);
    //                 ^^
    

    您必须使用%u 说明符告诉printf 运行时uEntryunsigned int。如果您使用 %dprintf 函数将期望 int,因此将您的输入重新解释为有符号值。

    【讨论】:

    • 您好肯尼,感谢您的回答。如果我设置 %u 说明符,我将得到 -13 的无符号值 4294967283。有什么问题。谢谢。
    • 没问题。那是变量位的无符号表示。
    • @pro:当您的格式说明符与您正在打印的值的类型不匹配时,行为未定义并且结果毫无意义。 IE。当您使用%u 打印-13 时,结果毫无意义。以及您最初使用%d 打印无符号值的尝试。如果您希望输出有意义,请始终使用正确的格式说明符:%u 代表 unsigned int%d 代表 signed int
    • @pro: -13 超出了unsigned int 的范围。当您将超出范围的数字转换为无符号类型时,它会通过重复加减该类型最大值的 1 来进入范围 - 在这种情况下,UINT_MAX + 1,在您的平台上为 4294967296,添加到 -13 得到 4294967283。
    • 大家好,感谢您的回答和 cmets。很有用!
    【解决方案2】:

    将这两行添加到代码末尾,您就会明白发生了什么。

    printf("entry: signed = %d, unsigned = %u, hex = 0x%x\n", entry, entry entry);
    printf("uEntry: signed = %d, unsigned = %u, hex = 0x%x\n", uEntry,uEntry,uEntry);
    

    【讨论】:

    • 虽然它可能有助于解释您的特定实现如何工作,但这两种调用都会导致未定义的行为。您必须根据您在格式字符串中指定的内容向printf 提供正确的类型,以便明确定义结果。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    相关资源
    最近更新 更多