go语言bigint go语言big包

Golang Float高精度计算,无误差Golang Float乘Float高精度 , 转Int高精度 。
使用big.Float
bigF1 := new(big.Float).SetFloat64(f1)
bigF2 := new(big.Float).SetFloat64(f2)
mul := new(big.Float).Mul(bigF1, bigF2)
转Int , 先用上面的方法转为big.Float,再用.String转为字符串 。
new(big.Int).SetString(bigFloat, 10) // 即可转为big.Int
// big.Int可转为常用的int类型 。
// big.Float可转为常用的Float类型 。
// big.Float不能直接转为Int类型 。
func Sub(x float64, y float64, more ...float64) float64 {
floatX := new(big.Float).SetFloat64(x)
floatY := new(big.Float).SetFloat64(y)
result := new(big.Float).Sub(floatX, floatY)
if len(more)0 {
for _, m := range more {
floatM := new(big.Float).SetFloat64(m)
result = new(big.Float).Sub(result, floatM)
}
}
f, _ := strconv.ParseFloat(result.String(), 64)
return f
}
golang之大端序、小端序当分别处于大小端模式下的内容存放如下
(1)大端模式存储(存储地址为16位)
地址数据
0x0004(高地址)0x44
0x00030x33
0x00020x22
0x0001(低地址)0x11
(2)小端模式存储(存储地址为16位)
地址数据
0x0004(高地址)0x11
0x00030x22
0x00020x33
0x0001(低地址)0x44
在前面也简单阐述了大小端序的定义并结合简单实例来说明,接下来会给出详细实例来说明:
1、大端序(Big-Endian):或称大尾序
一个类型: int32 的数 0X0A0B0C0D的内存存放情况
数据是以8bits为单位
2、小端序(little-endian):或称小尾序
比如0x00000001
大端序:内存低比特位 00000000 00000000 00000000 00000001 内存高比特位
小端序:内存低比特位 10000000 00000000 00000000 00000000 内存高比特位
其实在前面罗列出那么东西,最终是为了接下来讲述的在golang中涉及到网络传输、文件存储时的选择 。一般来说网络传输的字节序,可能是大端序或者小端序,取决于软件开始时通讯双方的协议规定 。TCP/IP协议RFC1700规定使用“大端”字节序为网络字节序,开发的时候需要遵守这一规则 。默认golang是使用大端序 。详情见golang中包encoding/binary已提供了大、小端序的使用
输出结果:
16909060 use big endian:
int32 to bytes: [1 2 3 4]### [0001 0002 0003 0004]
bytes to int32: 16909060
16909060 use little endian:
int32 to bytes: [4 3 2 1]### [0004 0003 0002 0001]
bytes to int32: 16909060
在RPCX框架中关于RPC调用过程涉及的传递消息进行编码的,采用的就是大端序模式
golang 结构体 字节对齐是怎么样的用golang解析二进制协议时,其实没必要管结构体的字段的对齐规则,何况语言规范也没有规定如何对齐,也就是没有规则 。用encoding/binary.Read函数直接读入struct里就行,struct就像c那样写
type Data struct {
Size, MsgType uint16
Sequence uint32
// ...
}
golang编译器加不加padding , Read都能正常工作,runtime知道Data的布局的,不像C直接做cast所以要知道怎样对齐 。
用unsafe.Alignof可以知道每个field的对齐长度,但没必要用到 。
package main
/*
#include stdint.h
#pragma pack(push, 1)
typedef struct {
uint16_t size;
uint16_t msgtype;
uint32_t sequnce;
uint8_t data1;
uint32_t data2;
uint16_t data3;
} mydata;
#pragma pack(pop)
mydata foo = {
1, 2, 3, 4, 5, 6,
};
int size() {
return sizeof(mydata);
}
*/
import "C"
import (
"bytes"
"encoding/binary"
"fmt"
"log"
"unsafe"

推荐阅读