はい、いつでも char から unsigned char に、またはその逆に問題なく変換できます。次のコードを実行し、それを ASCII テーブル (参照http://www.asciitable.com/ ) と比較すると、自分で証明を確認でき、C/C++ が変換をどのように処理するかを確認できます。まったく同じ方法で:
#include "stdio.h"
int main(void) {
//converting from char to unsigned char
char c = 0;
printf("%d byte(s)\n", sizeof(char)); // result: 1byte, i.e. 8bits, so there are 2^8=256 values that a char can store.
for (int i=0; i<256; i++){
printf("int value: %d - from: %c\tto: %c\n", c, c, (unsigned char) c);
c++;
}
//converting from unsigned char to char
unsigned char uc = 0;
printf("\n%d byte(s)\n", sizeof(unsigned char));
for (int i=0; i<256; i++){
printf("int value: %d - from: %c\tto: %c\n", uc, uc, (char) uc);
uc++;
}
}
行が多すぎるため、出力は投稿しません。各セクションの前半、つまり i=0:127 から、char から unsigned char への変換、およびその逆の変換が、変更や損失なしでうまく機能することが出力でわかります。
ただし、i=128:255 からは、char と unsigned char をキャストできません。または、unsigned char は [0:256] の値を保存し、char は間隔 [-128:127] の値を保存するため、出力が異なります。 ]))。それにもかかわらず、この後半の動作は無関係です。C/C++ では一般に、128 の異なる値と他の 128 の値 (文字の正または負符号なし文字の場合) は使用されません。
文字を表さない char に値を入れたり、文字を表さない unsigned char に値を入れたりしなければ、すべて問題ありません。
追加: C/C++ の文字列で UTF-8 またはその他のエンコーディング (特殊文字用) を使用する場合でも、この種のキャストを使用するものはすべて問題ありません。たとえば、UTF-8 エンコーディング (参照http:// lwp.interglacial.com/appf_01.htm ):
char hearts[] = {0xe2, 0x99, 0xa5, 0x00};
char diamonds[] = {0xe2, 0x99, 0xa6, 0x00};
char clubs[] = {0xe2, 0x99, 0xa3, 0x00};
char spades[] = {0xe2, 0x99, 0xa0, 0x00};
printf("hearts (%s)\ndiamonds (%s)\nclubs (%s)\nspades (%s)\n\n", hearts, diamonds, clubs, spades);
そのコードの出力は次のようになります:
ハート (♥)
ダイヤモンド (♦)
クラブ (♣)
スペード (♠)
各文字を符号なし文字にキャストした場合でも。
それで:
「unsigned char * をこの関数にいつでも安全に渡すことができますか?」はい!
「情報を失うことなく、自由に char と unsigned char の間で安全に変換 (キャスト) できることが保証されていますか?」はい!
「情報を失うことなく、char へのポインターと unsigned char の間で自由に安全に変換 (キャスト) できますか?」はい!
「答えは C と C++ で同じですか?」はい!