1

我正在尝试将负数从 String 转换为 unsigned long,但是由于“-”符号而得到意外结果。代码下方

    #include <stdio.h>
#include <string.h>

main()
{
   char * pValue = "-1234657890000";
    unsigned long ValueLong ;
    sscanf( pValue, "%llu", &ValueLong ) ;
    printf ("%llu",ValueLong);
}

代码不是将“-1234657890000”作为 printf 输出,而是显示此值“ 18446742839051661616 ”有什么建议吗?

谢谢

4

4 回答 4

1

您提供的值不适合 unsigned long (或者至少不能保证适合)。另一点是-1234567890000根本不是unsigned。改为使用long long并记住文字应该以 LL 为后缀,如下所示:

char * pValue = "-1234657890000LL";
于 2013-09-30T10:48:40.153 回答
1

您自己说过:“将负数转换为无符号长整数”。当您将负值转换为正值时会发生这种情况,即当您“告诉编译器要做什么”时。

您使用相同的值的内部(二进制)表示,相同的零和一序列进行操作。有符号或无符号类型告诉编译器如何处理保存该值并由变量引用的内存。

尝试

#include <stdio.h>
#include <string.h>

main()
{
       char * pValue = "-1234657890000";
       long ValueLong ;
       sscanf( pValue, "%ld", &ValueLong ) ;
       printf ("%ld\n",ValueLong);
       unsigned long v = (unsigned long)ValueLong;
       printf ("%lu\n",v);
}

你会得到

-1234657890000
18446742839051661616

这可能是一个更有趣的例子:

#include <stdio.h>
#include <string.h>
#include <limits.h>

main()
{
       char * pValue = "-1";
       long ValueLong ;
       sscanf( pValue, "%ld", &ValueLong ) ;
       printf ("%ld\n",ValueLong);
       unsigned long v = (unsigned long)ValueLong;
       printf ("%x\n",v);
       printf ("%x\n",UINT_MAX);
}

输出是

-1
ffffffff
ffffffff

请记住,输出取决于目标平台

于 2013-09-30T10:47:46.663 回答
0

说真的,整数常量的范围取决于编译器。对于像 Turbo C 或 Turbo C++ 这样的 16 位编译器,范围是 –32768 到 32767。对于 32 位编译器,范围会更大。我希望你得到答案。你正在跨越范围

于 2013-09-30T10:52:53.947 回答
0

谢谢大家,它已按照您的建议解决,如下所示,问题出在您提到的无符号数据类型上

#include <stdio.h>
#include <string.h>

main()
{
   char * pValue = "-1234657890000";
    long long  ValueLong ;
    sscanf( pValue, "%ld", &ValueLong ) ;
    printf ("%ld",ValueLong);
}
于 2013-09-30T11:04:28.883 回答