字符串转整型 strconv.ParseInt 第三个参数的作用是什么?

xuanwen · · 3169 次点击
感谢,根据你的提示,大概明白了第三个参数的意义 我新写了个例子,来验证了这个 ```golang package main import ( "fmt" "github.com/imroc/biu" "reflect" "strconv" ) func main() { d := "127" dNumber, err := strconv.ParseInt(d, 10, 8) // ok if err != nil { fmt.Println("dNumber 错误 %v", err) } e := "128" eNumber, err := strconv.ParseInt(e, 10, 8) // panic if err != nil { fmt.Println("eNumber 错误 %v", err) } f := "300" fNumber, err := strconv.ParseInt(f, 10, 8) // panic if err != nil { fmt.Println("fNumber 错误 %v", err) } g := int(128) gNumber := int8(g) h := int(300) hNumber := int8(h) fmt.Printf("d %d 类型 %s \n", dNumber, reflect.TypeOf(dNumber)) fmt.Printf("e %d 类型 %s \n", eNumber, reflect.TypeOf(eNumber)) fmt.Printf("f %d 类型 %s \n", fNumber, reflect.TypeOf(fNumber)) fmt.Printf("g %d 类型 %s \n", gNumber, reflect.TypeOf(gNumber)) fmt.Printf("h %d 类型 %s \n\n", hNumber, reflect.TypeOf(hNumber)) fmt.Println("d bit细节 ", dNumber, biu.ToBinaryString(dNumber)) fmt.Println("e bit细节 ", eNumber, biu.ToBinaryString(eNumber)) fmt.Println("f bit细节 ", fNumber, biu.ToBinaryString(fNumber)) fmt.Println("g bit细节 ", gNumber, biu.ToBinaryString(gNumber)) fmt.Println("h bit细节 ", hNumber, biu.ToBinaryString(hNumber)) } ``` #### 运行结果 ```golang eNumber 错误 %v strconv.ParseInt: parsing "128": value out of range fNumber 错误 %v strconv.ParseInt: parsing "300": value out of range d 127 类型 int64 e 127 类型 int64 f 127 类型 int64 g -128 类型 int8 h 44 类型 int8 d bit细节 127 [00000000 00000000 00000000 00000000 00000000 00000000 00000000 01111111] e bit细节 127 [00000000 00000000 00000000 00000000 00000000 00000000 00000000 01111111] f bit细节 127 [00000000 00000000 00000000 00000000 00000000 00000000 00000000 01111111] g bit细节 -128 10000000 h bit细节 44 00101100 ``` **第三个参数根据int类型位数,限制了最大的数值,超过则返回错误且数值等于最大数值** 同时需要注意整型之间的转换,int大数值高位往低位转的时候,可能不符合预期结果,需要特别注意 比如例子中的 int(300) 转成int8时,结果为 44
#2
更多评论
通过观察func ParseInt源码不难发现,bitsize的用意在于限制生成的int类型的位数,如果类型转换生成的int位数超过了规定的bitszie,则panic。您可以尝试把这一行的c的值改为128,他将panic报错,如果您将其改为127,那么将会正常执行。 ``` c := "128" cNumber, err := strconv.ParseInt(c, 10, 8) // panic c := "127" cNumber, err := strconv.ParseInt(c, 10, 8) // ok ```
#1