ホームページ > バックエンド開発 > C++ > `unsigned char` を処理するときに、`cout` は予期しない文字を出力するのに、`printf` は出力しないのはなぜですか?

`unsigned char` を処理するときに、`cout` は予期しない文字を出力するのに、`printf` は出力しないのはなぜですか?

Patricia Arquette
リリース: 2024-12-04 10:44:10
オリジナル
834 人が閲覧しました

Why Does `cout` Print Unexpected Characters When Handling `unsigned char` While `printf` Doesn't?

unsigned char を使用した cout の予測できない動作の背後にある謎を明らかにする

プログラミングでは、予期しない出力がフラストレーションや混乱につながることがよくあります。次のコードを考えてみましょう。

#include<iostream>
#include<stdio.h>

using namespace std;

int main() {
    unsigned char a;
    a = 1;
    printf("%d", a);
    cout << a;
}
ログイン後にコピー

このコードは、unsigned char 変数 'a' に格納されている値、つまり 1 を出力するように設計されています。ただし、実行すると、「1」の後に一見したようにいくつかの文字が出力されます。ランダムな文字。このシナリオでは、cout の動作が printf とは異なるのはなぜですか?

その答えは、unsigned char の性質にあります。 0 ~ 31 の値が割り当てられた ASCII 文字は印刷不可能とみなされます。値 1 に割り当てられた文字は印刷不可能な文字であり、cout はとにかく印刷を試みます。文字が印刷可能かどうかを判断するには、std::isprint 関数を使用できます。

std::cout << std::isprint(a) << std::endl;
ログイン後にコピー

このステートメントは、文字が印刷不可能であることを示す 0 (false) を出力します。

この問題を解決し、cout に a の値を 1 として出力させるには、それを unsigned にキャストします。 integer:

cout << static_cast<unsigned>(a) << std::endl;
ログイン後にコピー

このキャストは、印刷不可能な文字を対応する符号なし整数値に変換し、cout が 1 を正しく出力するようにします。

以上が`unsigned char` を処理するときに、`cout` は予期しない文字を出力するのに、`printf` は出力しないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート