cjson 整型数最大值不能超过INT_MAX

cjson 详细可参考:https://www.shangmayuan.com/a/6c2f135d12fe4cae9783e332.html

cJSON_Number 表示一个数字值。该值存储为double in valuedouble和in valueint。若是数字超出整数范围,INT_MAX或INT_MIN用于valueint

(INT_MAX INT_MIN)原文链接:https://blog.csdn.net/u012604810/article/details/80290706
C中常量INT_MAX和INT_MIN分别表示最大、最小整数,定义在头文件limits.h中。

  1. INT_MAX,INT_MIN数值大小
    因为int占4字节32位,根据二进制编码的规则,INT_MAX = 2^31-1,INT_MIN= -2^31.C/C++中,所有超过该限值的数,都会出现溢出,出现warning,但是并不会出现error。如果想表示的整数超过了该限值,可以使用长整型long long 占8字节64位。

  2. 关于INT_MAX INT_MIN的运算
    由于二进制编码按原码、补码和反码的规则进行运算,所有程序中对INT_MAX和INT_MIN的运算应当格外注意,在出现溢出的时候,不遵循数学规则。

INT_MAX + 1 = INT_MIN

INT_MIN - 1 = INT_MAX

abs(INT_MIN) = INT_MIN

比较有趣的是,INT_MAX + 1 < INT_MAX, INT_MIN - 1 > INT_MIN, abs(INT_MIN) < 0.

cjson.c:

static char print_number(cJSON item,printbuffer p)
{
char str=0;
double d=item->valuedouble;
if (d==0)
{
if § str=ensure(p,2);
else str=(char
)cJSON_malloc(2); /
special case for 0. /
if (str) strcpy(str,“0”);
}
else if (fabs(((double)item->valueint)-d)<=DBL_EPSILON && d<=INT_MAX && d>=INT_MIN)
{
if § str=ensure(p,21);
else str=(char
)cJSON_malloc(21); /
2^64+1 can be represented in 21 chars. /
if (str) sprintf(str,"%d",item->valueint);
}
else
{
if § str=ensure(p,64);
else str=(char
)cJSON_malloc(64); /
This is a nice tradeoff. */
if (str)
{
if (fabs(floor(d)-d)<=DBL_EPSILON && fabs(d)<1.0e60)sprintf(str,"%.0f",d);
else if (fabs(d)<1.0e-6 || fabs(d)>1.0e9) sprintf(str,"%e",d);
else sprintf(str,"%f",d);
}
}
return str;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值