我有以下简单的程序,它读取作为字符串给出的数字并打印它。它适用于小数字,但当我尝试使用大小为 unsigned long 的数字时,如“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:根据 this site unsigned long 的最大值为 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-1);
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;
}
ISO C标准只要求数据类型
unsigned long
能够表示0
到4,294,967,295
之间的数字。
在某些平台上,例如 64 位 Linux,
unsigned long
能够表示最多 18,446,744,073,709,551,615
的数字是很常见的。但是,在 64 位 Microsoft Windows 上,unsigned long
只能表示最多 4,294,967,295
的数字是很常见的。
与
unsigned long
相反,ISO C标准保证数据类型unsigned long long
能够在所有平台上表示至少18,446,744,073,709,551,615
的值。
为了确定在您的平台上
unsigned long
中可表示的最大数字,您可以检查宏常量ULONG_MAX
的值。
同样,为了确定在您的平台上
unsigned long long
中可表示的最大数量,您可以检查宏常量ULLONG_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