Teach me how to add! Everyone knows how to add numbers by hand, right?––Well, I hope so, but for anyone who needs a quick reminder:

To add 17282 and 1342, you proceed as follows:


place the larger (value wise, not number of digits) number above the smaller number and match up the digits

17282
 1342

draw the plus sign (+) to the left of the equation on the second row. The plus sign must be flush with the left side. 

 17282
+ 1342

draw a line of dashes (-) with one dash in each column of the digits of the first line

 17282
+ 1342
 -----

evaluate the expression and write the digits above each column if you need to 'carry' them

   1
 17282
+ 1342
 -----
 18624



Your output is what you get after applying step #4. You may have trailing whitespace, but there may not be any leading zeroes. 

You must write a program or a function that prints or returns the output. 

The input can be taken as either two separate inputs or an array with two items; the type of the inputs can be either string or integer. 

This is code golf so shortest code in bytes wins!

Edit: 

The largest number you could expect to receive as output/the sum is the largest integer that your system will display without exponents (thanks to Adám). 

More examples:

Input: 
1596, 8404
Output:
1111
 8404
+1596
 ----
10000

Input:
1776, 76
Output:
  11
 1776
+  76
 ----
 1852

Input:
123, 456
Output:
 456
+123
 ---
 579
Dyalog APL, 90 bytes

{⌽↑(⊂⌽s),⍨↓⌽(' + ',⍨' 1'⊃⍨l&lt;⍴s),'-'⍪⍨w⍪⍨' 1'[10|(⍎¨(-l←⍴⍉w)↑s←⍕+/⍵)-(+/0 10⊤⍎)¨⊂[0]w←⍕⍪⍵]}


Takes list of two numbers as argument. Needs ⎕IO←0 which is default on many systems.

      f←{⌽↑(⊂⌽s),⍨↓⌽(' + ',⍨' 1'⊃⍨l&lt;⍴s),'-'⍪⍨w⍪⍨' 1'[10|(⍎¨(-l←≢⍉w)↑s←⍕+/⍵)-(+/0 10⊤⍎)¨⊂[0]w←⍕⍪⍵]}
      f¨(17282 1342)(1596 8404)(1776 76)(123 456)
┌──────┬─────┬─────┬────┐
│   1  │1111 │  11 │    │
│ 17282│ 1596│ 1776│ 123│
│+ 1342│+8404│+  76│+456│
│ -----│ ----│ ----│ ---│
│ 18624│10000│ 1852│ 579│
└──────┴─────┴─────┴────┘


TryAPL online! Note that ⎕IO has been set and ⍎ has been emulated with e as ⍎ is banned from TryAPL for security reasons.

Ungolfed and explained


  { An anonymous function
  
  
    w ← ⍕ ⍪⍵ w gets the textified vertical arrangement of the argument
    (the numbers to be added)
    
    l ← ≢ ⍉w s gets the count of rows in the transposed w (i.e. the
    number of columns in w)
    
    s ← ⍕ +/⍵ s gets the textified sum of the argument
    
    ' 1'[... index into the string " 1", so zeros give spaces, and ones
    give character 1s.
    
    
      ⊂[0] w enclose down, gets list of pairs of corresponding digits in
      the numbers
      
      (+/ 0 10 ⊤ ⍎)¨ for each pair; make into digit(s), then sum
      
      (⍎¨ (-l) ↑ s)- chop left-most digit of grand total to the width of
      the longest input, then make each character into separate number and
      subtract the column sums (if the sum does not add up to the total, the
      discrepancies are due to carrys, so this gives us each column's carry)
      
      10| division remainder when divided by 10
    
    
    ] [end of indexing]
    
    w⍪⍨ stack the input numbers below
    
    '-'⍪⍨ stack a minus below each column
    
    (' + ',⍨' 1'⊃⍨l&lt;⍴s), prepend a space to the 2nd line, a
    plus to the 3nd, a space to the 4rd, and a one
    or space to the 1st – depending on if the sum is wider than
    the widest input (meaning we need a carry high over the plus )
    
    ⌽ mirror right-left (so left-justification will be to the right)
    
    ↓ make table into list of lines (so that differing line lengths are
    allowed
    
    (⊂⌽s),⍨ append the sum
    
    ↑ combine list of lines into table (padding the right with spaces as
    needed)
    
    ⌽ mirror back to normal
  
  
  } [end of function]`