case SHR: i=cint(a); return i.shr(cint(b));
case SHA: i=cint(a); return i.sha(cint(b));
case PLUS:
obj = visitThis(a);
if (obj instanceof IntExpression) { i=(IntExpression)obj; return i.plus(cint(b)); }
s = (Expression)obj; return s.union(cset(b));
case MINUS:
// Special exception to allow "0-8" to not throw an exception, where 7 is the maximum allowed integer (when bitwidth==4)
// (likewise, when bitwidth==5, then +15 is the maximum allowed integer, and we want to allow 0-16 without throwing an exception)
if (a instanceof ExprConstant && ((ExprConstant)a).op==ExprConstant.Op.NUMBER && ((ExprConstant)a).num()==0)
if (b instanceof ExprConstant && ((ExprConstant)b).op==ExprConstant.Op.NUMBER && ((ExprConstant)b).num()==max+1)