您自己说过:“将负数转换为无符号长整数”。当您将负值转换为正值时会发生这种情况,即当您“告诉编译器要做什么”时。
您使用相同的值的内部(二进制)表示,相同的零和一序列进行操作。有符号或无符号类型告诉编译器如何处理保存该值并由变量引用的内存。
尝试
#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
请记住,输出取决于目标平台