将负数从String转换为unsigned Long

时间:2013-09-30 10:44:03

标签: c printf

我正在尝试将负数从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 个答案:

答案 0 :(得分:1)

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

您使用相同的内部(二进制)表示值,相同的0和1序列进行操作。类型signed或unsigned告诉编译器如何处理保存值的内存并由变量引用。

尝试

#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

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

答案 1 :(得分:1)

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

char * pValue = "-1234657890000LL";

答案 2 :(得分:0)

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

答案 3 :(得分:0)

全心全意,根据您的建议解决了问题,问题出在您提到的无符号数据类型

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

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