## B.8. Arithmetic

Starting with ksh93m, the built-in arithmetic facility understands a large percentage of the C language's expressions. This makes the shell more attractive as a full-blown programming language. The following features are available:

Trailing type suffixes
  Integer constants can have a trailing `U` or `L` suffix to indicate that they are unsigned or long, respectively. While the lowercase versions may also be used, this is not recommended, since it is easy to confuse an `l` (letter ell) with a `1` (digit one).
C character constants
  C single-quoted character constants are recognized. As in C, they act like integer constants. For example:

  >     $ typeset -i c
  >     $ for ((c = 'a'; c <= 'z'; c++))
  >     > do print $c
  >     > done
  >     97
  >     98
  >     99
  >     100
  >     ...

Octal and hexadecimal constants
  You can use the C format for octal (base 8) and hexadecimal (base 16) constants. Octal constants start with a leading `0`, and hexadecimal constants start with a leading `0x` or `0X`. For example:

  >     $ print $((010 + 1))     Octal 10 is decimal 8
  >     9
  >     $ print $((0x10 + 1))    Hexadecimal 10 is decimal 16
  >     17

Unsigned integer arithmetic
  By using typeset -ui, you can create unsigned integers. Regular integers represent both positive and negative numbers. Unsigned integers start at 0, go up to some implementation-dependent value, and then "wrap" around again to 0. Similarly, subtracting 1 from 0 wraps around the other way, yielding the largest unsigned number:

  >     $ typeset -ui u=0
  >     $ let u--
  >     $ print $u
  >     4294967295

C operators and precedence
  ksh supports the full set of C operators, with the same precedence and associativity. The operators were presented in detail in Chapter 6 and are summarized again below.

Operator | Meaning | Associativity
--- | --- | ---
`++` `--` | Increment and decrement, prefix and postfix | Left to right
`+` `-` `!` `~` | Unary plus and minus; logical and bitwise negation | Right to left
`**` | Exponentiation[157] | Right to left
`*` `/` `%` | Multiplication, division, and remainder | Left to right
`+` `-` | Addition and subtraction | Left to right
`<<` `>>` | Bit-shift left and right | Left to right
`< <= > >=` | Comparisons | Left to right
`==` `!=` | Equal and not equal | Left to right
`&` | Bitwise and | Left to right
`^` | Bitwise exclusive-or | Left to right
`|` | Bitwise or | Left to right
`&&` | Logical and (short circuit) | Left to right
`||` | Logical or (short circuit) | Left to right
`?:` | Conditional expression | Right to left
`= += -= *= /= %= &= ^= <<= >>=` | Assignment operators | Right to left
`,` | Sequential evaluation | Left to right

[157] ksh93m and newer. The `**` operator is not in the C language.

Copyright © 2003 O'Reilly & Associates. All rights reserved.