打印无符号长整数时出现问题

Problem with printing unsigned long integers

提问人:3nondatur 提问时间:5/3/2023 最后编辑:3nondatur 更新时间:5/4/2023 访问量:90

问:

我有以下简单的程序,可以读取以字符串形式给出的数字并打印出来。它适用于小数,但是当我尝试使用大小为无符号长整型的数字(如“18446744073709551615”)时,它不会产生预期的结果。这是我的代码:

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

void readNumbers(char* numbers, unsigned long numbers_length, unsigned long* number)
{
    char string[numbers_length + 1];
    strncpy(string, numbers + 0, numbers_length);
    *number = strtoul(string, NULL, 10);
}

int main () {

  unsigned long number;

  char* numbers = "18446744073709551615";
  unsigned long numbers_length = strlen(numbers);
  readNumbers(numbers, numbers_length, &number);
  printf("X = %lu \n", number);            // prints 4294967295

  return 0;
}

Edit_1:根据本网站,无符号多头的最大值为18446744073709551615。

Edit_2:以下代码适用于我的系统:

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

void readNumbers(char* numbers, int numbers_length, unsigned long long* number)
{
    char string[numbers_length + 1];
    strncpy(string, numbers + 0, numbers_length);
    string[numbers_length] = '\0';
    *number = strtoull(string, NULL, 10);
}


int main () {

  unsigned long long number;

  char* numbers = "18446744073709551615";
  int numbers_length = strlen(numbers);
  readNumbers(numbers, numbers_length, &number);
  printf("X = %llu \n", number);       
  return 0;
}
C 类型 符号 无 符号整数

评论

2赞 Eugene Sh. 5/3/2023
你相信这个数字合适吗?unsigned long
1赞 Eugene Sh. 5/3/2023
numbers + 0这应该达到什么目的?
4赞 Steve Summit 5/3/2023
部分问题在于它没有做你认为它所做的事情。尝试在调用 之后添加 ,以便您有一个适当的以 null 结尾的字符串可供使用。(但实际上,我认为,您根本不需要制作数字字符串的额外副本,也不需要担心它的长度。strncpystring[numbers_length] = '\0';strncpystrtoul
2赞 Steve Summit 5/3/2023
顺便说一句,tutorialspoint网站在这一点上是错误的
2赞 Steve Summit 5/3/2023
如果您仍然遇到麻烦,通常的建议是:您需要明确告诉我们您期望的结果,以及您得到的结果。仅仅说“它不起作用”是相当模糊的,并且会导致我们不必要的猜测。

答:

5赞 Andreas Wenzel 5/3/2023 #1

ISO C 标准仅要求数据类型能够表示从 到 之间的数字。unsigned long04,294,967,295

在某些平台上,通常能够表示比 ISO C 标准要求更大的数字。例如,在 64 位 Linux 上,通常能够表示最多 .但在其他平台上,例如 64 位 Microsoft Windows,通常只能表示高达 的数字,即 ISO C 标准要求的最小量。unsigned longunsigned long18,446,744,073,709,551,615unsigned long4,294,967,295

与此相反,数据类型由 ISO C 标准保证,至少能够在所有平台上表示值。unsigned longunsigned long long18,446,744,073,709,551,615

为了确定平台上可表示的最大数字,您可以检查宏常量ULONG_MAX的值。unsigned long

同样,为了确定平台上可表示的最大数量,您可以检查宏常量的值。unsigned long longULLONG_MAX

下面是一个示例程序:

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

int main( void )
{
    printf( "  UINT_MAX: %u\n",   UINT_MAX );
    printf( " ULONG_MAX: %lu\n",  ULONG_MAX );
    printf( "ULLONG_MAX: %llu\n", ULLONG_MAX );
}

在使用 MS Visual Studio 的 64 位 Microsoft Windows 上,我得到以下输出:

  UINT_MAX: 4294967295
 ULONG_MAX: 4294967295
ULLONG_MAX: 18446744073709551615

在 64 位 Linux 上,我得到以下输出:

  UINT_MAX: 4294967295
 ULONG_MAX: 18446744073709551615
ULLONG_MAX: 18446744073709551615

UINT_MAX是 中可表示的最大值。unsigned int