let rec destruct_integer e = match e.enode with
  | Lval(Var v,NoOffset-> Some(v,None)
  | BinOp((PlusA | MinusA as op),e1,e2,_) ->
      begin match destruct_integer e1 with
        | None -> None
        | Some(v,None->
            begin match op with
              | PlusA -> Some(v,Some e2)
              | MinusA -> Some(v,Some(new_exp(UnOp(Neg,e2,almost_integer_type))))
              | _ -> assert false
            end
        | Some(v,Some off) ->
            begin match op with
              | PlusA ->
                  Some(v,Some(new_exp(BinOp(PlusA,off,e2,almost_integer_type))))
              | MinusA ->
                  Some(v,Some(new_exp(BinOp(MinusA,off,e2,almost_integer_type))))
              | _ -> assert false
            end
      end
  | CastE(ty,e) ->
      let ety = typeOf e in
      if isIntegralType ty && isIntegralType ety then
        destruct_integer e
      else None
  | _ -> None