title: Can I turn unsigned char into char and vice versa?
body: <p>I want to use a function that expects data like this:</p>
  
  <pre><code>void process(char *data_in, int data_len);
  </code></pre>
  
  <p>So it's just processing some bytes really.</p>
  
  <p>But I'm more comfortable working with "unsigned char" when it comes to raw bytes (it somehow "feels" more right to deal with positive 0 to 255 values only), so my question is:</p>
  
  <p>Can I always safely pass a <code>unsigned char *</code> into this function?</p>
  
  <p>In other words:</p>
  
  <ul>
  <li>Is it guaranteed that I can safely convert  (cast) between char and unsigned char at will, without any loss of information?</li>
  <li>Can I safely convert (cast) between pointers to char and unsigned char at will, without any loss of information?</li>
  </ul>
  
  <p>Bonus: Is the answer same in C and C++?</p>