cloudwu / sproto

Yet another protocol library like google protocol buffers , but simple and fast.
MIT License
942 stars 253 forks source link

int 编码错误 #59

Closed yingnierxiao closed 7 years ago

yingnierxiao commented 7 years ago

在手机设备上 2947483648数值溢出了。显示为-1347483648 。pc版本正常显示。

yingnierxiao commented 7 years ago

'ptrdiff_t' was chosen because it is defined as part of C89 and happens to be a signed type that is 32 bits for 16 bit or 32 bit CPUs and 64 bits for 64 bit CPUs. 电脑上面是64位的所以lua_Integer的大小是8,手机上面是4,所以转换完就溢出了 http://lua-users.org/lists/lua-l/2004-12/msg00106.html

cloudwu commented 7 years ago

sproto 的 c 接口是支持 64bit 的,如果 所在平台的 lua 不支持 64bit 整数是 lua 本身的限制,不是 sproto 的。

cloudwu commented 7 years ago

另外, lua_integer 用 ptrdiff_t 是老黄历了,现在 lua 用的是 long long 或 int64 。请选择 lua 5.3 以后的版本,在 lua 5.3 以前,语言并不支持 64 bit 整数。

yingnierxiao commented 7 years ago

嗯嗯 客户端还在使用旧版本的lua 所以没法升级

yingnierxiao commented 7 years ago

https://github.com/cloudwu/sproto/blob/master/lsproto.c#L344 这个行用lua_integer来保存,如果大于2^31就已经溢出了,而旧版本lua的number类型支持到2^52.能否在这个地方做个底版本的lua兼容呢?

cloudwu commented 7 years ago

自己改,把 pushinteger 改成 pushnumber. 我不想为老版本 lua 增加代码。这行不是关键,下面一行 pushinteger 才是。

yingnierxiao commented 7 years ago

好吧

cloudwu commented 7 years ago

你说的这个地方我改了,不管关键还是下面一个分支需要用 pushnumber 。

yingnierxiao commented 7 years ago

嗯 对呀。2个地方都是关键点