You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

unsigned long整数打印异常:最大值输出不符合预期求助

问题:unsigned long最大值解析异常的原因与修复

问题场景

我编写了一个读取字符串形式数字并打印的程序,处理小数字时正常,但解析unsigned long类型最大值(字符串"18446744073709551615")时,输出结果不符合预期,打印出了4294967295。问题代码如下:

#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;
}

问题根源

  1. 类型长度不匹配:多数系统中unsigned long是32位类型,最大值仅为4294967295,并非你预期的64位最大值18446744073709551615。当strtoul遇到超出unsigned long范围的数值时,会返回ULONG_MAX(该系统下unsigned long的最大值),这就是输出异常的核心原因。
  2. 字符串未正确终止:strncpy在源字符串长度等于目标缓冲区长度时,不会自动添加'\0'终止符,可能导致strtoul读取时出现未定义行为。

修复方案

使用64位无符号整数类型unsigned long long存储最大值,搭配对应的字符串转数值函数strtoull,同时手动添加字符串终止符。修复后的代码如下:

#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;
}

关键修改点

  • 存储类型从unsigned long改为unsigned long long,确保能容纳64位无符号整数最大值
  • 用strtoull替代strtoul,专门解析unsigned long long类型数值
  • 手动给复制后的字符串添加'\0'终止符,避免未定义行为
  • 打印时使用%llu格式符,匹配unsigned long long类型

内容的提问来源于stack exchange,提问作者3nondatur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 07:53:13