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

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

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

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1581閲覧

C++ ビット操作の符号処理について

KN2018

総合スコア22

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

1クリップ

投稿2018/09/21 14:23

開発環境は Windows10 で Visual Studio 2017 Version15.3.3 です。

以下のようなコードを警告レベルを最高にした /Wall でコンパイルすると、「warning C4365: 'int' から 'unsigined short' に変換しました。signed/unsigned が一致しません。」という警告が出てしまいます。
「ビット操作は必ず int での処理となる」という規定があったかどうか知りたいと思っています。
大変些細な質問で申し訳ありませんが、どうぞ宜しくお願いいたします。


unsigned short a = 1;
unsigned short b = 2;
unsigned short c = a | b; // ここで C4365 の警告が出ます

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

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

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

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

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

guest

回答2

0

ベストアンサー

こんにちは。

a | bは整数演算で、かつ、それぞれの変数はint型で表現できますのでint型へ自動的に変換してから演算されます
それを unsigned short型変数へ代入するため、警告がでるという流れです。
個人的にはこの警告は「大きなお世話」と感じますが、必要なケースがあるのかも知れません。

投稿2018/09/21 15:17

Chironian

総合スコア23274

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

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

KN2018

2018/09/21 15:50

迅速に回答をしてくださり、大変ありがとうございます。 リンク先の記事も分かりやすくて、深く勉強になりました。今まで符号無しは符号無しでビット拡張されるものだと思ってましたので、この間違いを訂正することができてとても感謝しております。 整数の除算をよくするので、その最適化を考えて符号無しを好んで使ってましたから、今回指摘してもらえたことは私にとって本当に大きなことになりました。本当にありがとうございました。
guest

0

Conversionsの項ですね。

If the operand passed to an arithmetic operator is integral or unscoped enumeration type, then before any other action (but after lvalue-to-rvalue conversion, if applicable), the operand undergoes integral promotion.

演算に先立ってそれぞれ暗黙的な整数変換によってintに変換されることになるので、結果もintになります。
Integral promotionの項では

signed char or signed short can be converted to int;

とありますが、演算効率を考えるとintになるんではないかと。

投稿2018/09/21 15:18

toki_td

総合スコア2850

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

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

KN2018

2018/09/21 15:50

迅速な回答をしてくださって、大変ありがとうございます。ベストアンサーは1つしか選べないようなので、回答時間が早かったChironianさんをベストアンサーにさせていただきましたが、toki_idさんの回答も本当に分かりやすかったです。 大変勉強になりました。本当にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問