質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

Q&A

解決済

4回答

10614閲覧

unsigned char* をchar*にキャストしたらどんな問題があるでしょうか?

takey

総合スコア312

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

キャスト

キャストとは、オブジェクトの型の変換が許可された場合に、明白に別の型への変換を行うプロセスのことです。

0グッド

0クリップ

投稿2020/05/19 02:25

編集2020/05/19 04:18

組み込みでCを使っています。

c

1UCHAR send_buffer[BUF_SIZE]; 2 3sprintf((CHAR*)send_buffer, "%s\n", HOGE);

UCHARunsigned charで、CHARcharとしてtypedefされています。

上記のコードで、(CHAR*)によるキャストを行わないと、

pointer targets in passing argument 1 of 'sprintf' differ in signedness

といったwarningが出てきます。

warningが煩わしいのでキャストしたいのですが、これによる問題としてどんなことが考えられるでしょうか? あるいは特に問題はないですか?

send_bufferの型をCHARにすればよいのですが、使用しているライブラリの都合の関係で、そうはできない状態です。

よろしくお願いします。

【追記】
charsigned charです。

【追記2】
皆様回答有り難うございました。

(UCHAR*)から(CHAR*)にキャストしても内部表現のビット列は変化しないため、大丈夫だろうという判断をいたしました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

そのポインタの指すアドレスの先に、もし、負の値が入っていた場合、そのビットの並びを正の数を前提として読み取ってしまう為、
意図しない数値になってしまう恐れはあります。
しかし、元からsignedを前提のデータが入っていて、四則演算等をしないのであれば、特に問題は無いかと。

C

1unsigned char c=255; 2 3printf("%d,%d",c,(signed char)c);

とすれば、結果は
255,-1
となりますが、中のデータそのものに変化はありません。

投稿2020/05/19 03:12

amiya

総合スコア1218

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

範囲が違うため、表現できる値に差が生まれます。charの保存できる値は-127~127、unsigned charの保存できる値は0〜255です。

認識が甘かったみたいです。
charに関しては処理系依存のようですね。
参考:https://qiita.com/SaitoAtsushi/items/555b3851017b120c85b7

投稿2020/05/19 02:31

編集2020/05/19 02:34
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takey

2020/05/19 02:39

charに関して追記しました。 UCHARをCHARにキャストすると表現できる値の範囲から外れて不具合が起きる可能性はありますが、sprinfにおいて、UCHAR*をCHAR*にキャストした場合でもそれは起こるのでしょうか?
guest

0

解決済みですが、念の為。そもそも文字列型とバイト型を混同しないように組む(sprintfを使わない)のもありだと思います。以下、修正例、動作未確認。

C

1UCHAR send_buffer[BUF_SIZE]; 2int len = strlen(HOGE); 3 4//ここでlenとBUF_SIZEを比較してサイズ確認するのも良い。 5 6memcpy(&buffer[0], HOGE, len); 7memcpy(&buffer[len], "\n", 2); 8 9

投稿2020/05/19 05:08

HogeAnimalLover

総合スコア4830

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

特に問題はないです。

ワーニングは警告です。バグのある可能性のある記述を知らせてくれるものなので、あなた自身が問題のないものと判断されるものは無視しても構いません

投稿2020/05/19 02:28

y_waiwai

総合スコア88024

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問