I would expect the following code to produce equality, but bool values are shown to be different.
#include <iostream>
union crazyBool
{
    unsigned char uc;
    bool b;
};
int main()
{
    crazyBool a, b;
    a.uc = 1;
    b.uc = 5;
    if(a.b == b.b)
    {
            std::cout << "==" << std::endl;
    }
    else
    {
            std::cout << "!=" << std::endl;
    }
    bool x, y;
    void *xVP = &x, *yVP = &y;
    unsigned char *xP = static_cast<unsigned char*>(xVP);
    unsigned char *yP = static_cast<unsigned char*>(yVP);
    (*xP) = (unsigned char)1;
    (*yP) = (unsigned char)5;
    if(x == y)
    {
            std::cout << "==" << std::endl;
    }
    else
    {
            std::cout << "!=" << std::endl;
    }
    return 0;
}
Note that here we are not only changing the value through union (which was pointed out as being undefined), but also accessing memory directly via void pointer.
 
    