title: Relation between numeric representation of memory address and alignment?
body: <p>Example:</p>
  
  <pre><code>std::ptrdiff_t dist(void* a, void* b)
  {
      return static_cast&lt;std::uint8_t*&gt;(b) - static_cast&lt;std::uint8_t*&gt;(a);
  }
  
  Align8Type align8; // alignof(Align8Type) == 8
  std::uintptr_t(&amp;align8) &amp; 3; // [1]
  dist(nullptr, &amp;align8) &amp; 3; // [2]
  Align8Type* p = reinterpret_cast&lt;Align8Type*&gt;(static_cast&lt;std::uint8_t*&gt;(nullptr) + dist(nullptr, &amp;align8));
  assert(&amp;align8 == p); // [3]
  </code></pre>
  
  <p><strong>Assuming <code>std::uint8_t</code> is supported</strong>, are the results of [1] &amp; [2] guaranteed to be 0 and is [3] guaranteed to be true in c++ standard?
  If not, what about in practice?</p>