2012-05-25 7 views
12

¿Cómo se convierte una cadena larga de dígitos (50 dígitos) en un número entero en Ir?¿Usa valores de enteros grandes en Go? (ParseInt solo convierte hasta "2147483647"?)

estoy recibiendo la salida para el código de abajo:

number = 2147483647 

err = strconv.ParseInt: análisis "37107287533902102798797998220837590246510135740250 ": valor fuera de rango

Parece ser capaces para convertir números solo hasta 2147483647.

package main 

import "fmt" 
import "io/ioutil" 
import "strings" 
import "strconv" 

var (
     number int64 
) 

func main() { 
    fData,err := ioutil.ReadFile("one-hundred_50.txt") 
    if err != nil { 
      fmt.Println("Err is ",err) 
     } 
    strbuffer := string(fData) 
    lines := strings.Split(strbuffer, "\n") 

    for i, line := range lines { 
     fmt.Printf("%d: %s\n", i, line) 
     number, err := strconv.Atoi(line) 
     fmt.Println("number = ", number) 
     fmt.Println("err = ", err) 
    } 
} 
+4

Los enteros generalmente se almacenan en 4 u 8 bytes. Esto no es suficiente para almacenar 50 dígitos y 2147483647 corresponde a (2^31-1), que es precisamente el límite de un entero de complemento de dos firmado y almacenado en 4 bytes (o, más precisamente, 32 bits). Ver si Go tiene un tipo de "Entero grande". –

Respuesta

26

Desea el paquete math/big, que proporciona compatibilidad con enteros de precisión arbitraria.

import "math/big" 

func main() { 
    // ... 
    for i, line := range lines { 
     bi := big.NewInt(0) 
     if _, ok := bi.SetString(line, 10); ok { 
      fmt.Printf("number = %v\n", bi) 
     } else { 
      fmt.Printf("couldn't interpret line %#v\n", line) 
     } 
    } 
} 

Aquí hay un quick example de ella trabajando.