java运算溢出_JAVACard 基本数据类型的运算及溢出问题

一.数据的运算

在目前javacard开发中,能用到的基本数据类型是byte和short,而对与java来说这两种都是有符号的数,因此在基本运算时会有大量的强制类型转换,因此经常导致数据溢出的情况,为了以后少掉进坑里,这里做简要的记录。

当整数的数据大小超出了可以表示的范围的时候,而程序又没有做数值检查,就会发生数据溢出的问题。例如对于byte的整数来说,其表示的范围大小是-128~127;short类型的基本数据的取值范围为-32768~32767。在javacard中大部分涉及到byte数据类型的处理,而byte数据类型大小非常有限,正整数的范围只有127,超过则变成负数,计算会得到意料之外的结果。因此在javacard的applet程序中要特别注意。

例如当计算(short)121+(byte)0xAC时得到的结果是37,因为byte0xAC实际代表的数据大小是-84,那么如果要进行正整数运算怎么办呢,可以在(byte)0xAC&0xFF,这样(byte)0xAC就转换成了正整数172,而(short)121+((byte)0xAC&0xFF)可以得到预期的结果293。但是这个时候也应该注意,不可以写成

(short)121+(byte)0xAC&0xFF,此时的计算结果还是37,那是因为+的运算优先级大于&,所以先求加法运算,然后再&运算,附上java优先级的列表

运算符结合性

[ ] . ( ) (方法调用)

从左向右

! ~ ++ -- +(一元运算) -(一元运算)

从右向左

* / %

从左向右

+ -

从左向右

<< >> >>>

从左向右

< <= > >= instanceof

从左向右

== !=

从左向右

&

从左向右

^

从左向右

|

从左向右

&&

从左向右

||

从左向右

?:

从右向左

= += -= *= /= %= &= |= ^= <<= >>= >>=

从右向左

对于javacard的APDU通信协议,需要大量的byte数据处理,任何需要正整数的场合,如字节长度等都需要&0xFF。

二.类型的转换

JavaCard主要支持两种基本数据类型,short和byte,因此当short数据类型转换成byte时,一定要注意数据溢出问题,例如对于short(227),转换成byte类型的结果是21。这是因为short(227)转换为16进制数据类型为0x115,转换为byte后为0x15,十进制就是21.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值