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

在C语言(-std=gnu89标准)中将超大字符数组转换为整数

超大数字字符串转整数的GNU89兼容方案

方案一:使用GNU扩展__int128类型

由于你使用-std=gnu89标准,GNU提供的__int128扩展类型可以轻松处理你的目标数字(其最大值约为1.7e38,远大于你给出的1.7e21)。标准库没有直接的字符串转__int128函数,手动实现即可:

#include <stdio.h>
#include <ctype.h>

__int128 str_to_int128(const char *str) {
    __int128 result = 0;
    int sign = 1;

    // 跳过前置空白字符
    while (isspace((unsigned char)*str)) {
        str++;
    }

    // 处理正负号
    if (*str == '-' || *str == '+') {
        sign = (*str == '-') ? -1 : 1;
        str++;
    }

    // 逐位转换为__int128
    while (isdigit((unsigned char)*str)) {
        result = result * 10 + (*str - '0');
        str++;
    }

    return result * sign;
}

// 辅助打印__int128(标准库printf不直接支持该类型)
void print_int128(__int128 num) {
    if (num < 0) {
        putchar('-');
        num = -num;
    }
    if (num > 9) {
        print_int128(num / 10);
    }
    putchar(num % 10 + '0');
}

int main() {
    const char *num_str = "1718944270642558716715";
    __int128 num = str_to_int128(num_str);
    print_int128(num); // 输出:1718944270642558716715
    putchar('\n');
    return 0;
}

编译时直接使用-std=gnu89参数即可,无需额外配置。

方案二:手动实现大整数结构(无扩展依赖)

如果你的数字可能超过__int128范围,或者不想依赖GNU扩展,可以用结构体+数组模拟大整数,逐位存储和转换:

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

// 定义最大支持的位数,可按需调整
#define MAX_DIGITS 30

typedef struct {
    int digits[MAX_DIGITS]; // 低位在前存储数字
    int length;             // 有效数字长度
    int is_negative;        // 是否为负数
} BigInt;

void str_to_bigint(const char *str, BigInt *num) {
    memset(num->digits, 0, sizeof(num->digits));
    num->length = 0;
    num->is_negative = 0;

    // 跳过前置空白
    while (isspace((unsigned char)*str)) {
        str++;
    }

    // 处理符号
    if (*str == '-') {
        num->is_negative = 1;
        str++;
    } else if (*str == '+') {
        str++;
    }

    // 逆序存储数字(低位放数组开头)
    int str_len = strlen(str);
    num->length = str_len;
    for (int i = 0; i < str_len; i++) {
        if (!isdigit((unsigned char)str[str_len - 1 - i])) {
            // 遇到非法字符,清空结果
            num->length = 0;
            return;
        }
        num->digits[i] = str[str_len - 1 - i] - '0';
    }
}

void print_bigint(const BigInt *num) {
    if (num->is_negative && num->length > 0) {
        putchar('-');
    }
    if (num->length == 0) {
        putchar('0');
        return;
    }
    // 从高位到低位打印
    for (int i = num->length - 1; i >= 0; i--) {
        putchar(num->digits[i] + '0');
    }
}

int main() {
    const char *num_str = "1718944270642558716715";
    BigInt num;
    str_to_bigint(num_str, &num);
    print_bigint(&num); // 输出:1718944270642558716715
    putchar('\n');
    return 0;
}

这个方案完全基于C89标准,兼容-std=gnu89,且支持任意长度的数字(只需调整MAX_DIGITS的值)。

内容的提问来源于stack exchange,提问作者Enwerem Melvin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 19:44:57