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

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

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

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

キャスト

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

C++

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

Q&A

3回答

6954閲覧

【C++】long long int型からint型へのキャストの際の挙動

pifacela

総合スコア19

C++/CLI

C++/CLIは、.NET Frameworkの共通言語基盤であるCLI向けにC++を拡張したプログラム言語です。前身のC++マネージ拡張と比較するとシンプルで分かりやすい構文になっており、高い可読性を持ちます。

キャスト

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

C++

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

0グッド

0クリップ

投稿2021/05/04 03:42

C++においてlong long int型(環境によってこの型の定義が異なるという事なので、long long int型を「unsignedではない、純粋にint型を拡張した型」と読み替えてください)からint型へ変換するとき、long long int型の変数aは、aに代入されている値がint型で扱える範囲内であれば、int型にキャストしたとき、正しい状態(正しい状態とは、例えば、a = 64のときint型にキャストされたとすると、aをキャストして得られたbはint型として64という値を保持しているという事です)に変換されますか?

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

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

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

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

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

guest

回答3

0

C# には明るくないので確信を持って言えません (常識的には維持されるでしょう) が、 C と C++ では変換後の型で表現可能な値であればその値が維持されることは言語仕様が保証しています。

具体的に、 C17 の 6.3.1.3 にはこう書かれています。

When a value with integer type is converted to another integer type other than _Bool, if the value can be represented by the new type, it is unchanged.
(整数型の値が _Bool 以外の別の整数型に変換されると、新しい型で値を表すことができれば変更されません。)
Otherwise, if the new type is unsigned, the value is converted by repeatedly adding or subtracting one more than the maximum value that can be represented in the new type until the value is in the range of the new type.
(そうではなく新しい型が符号なしである場合、値は新しい型の範囲内になるまで、新しい型で表すことができる最大値を繰り返し追加または減算することによって値を変換します。)

C++17 の 7.8.3 にはこうあります。

If the destination type is signed, the value is unchanged if it can be represented in the destination type; otherwise, the value is implementation-defined.

(変換先の型が符号付きである場合、変換先の型で表すことができれば値は変更されません。 それ以外の場合には値は処理系定義です。)

ちなみに C++20 以降では負数の表現が二の補数とすることになりました (従来は一の補数や、符号と絶対値の組で表す表現も認められていました) ので、変換先の型が符号付きの場合にその表現範囲内で表せなくても変換後の値について保証されるように変更されています。

投稿2021/05/04 03:51

編集2021/05/04 04:24
SaitoAtsushi

総合スコア5675

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

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

0

に変換されますか?

されますよ

もとの値が、intの範囲外であった場合は、そう言うわけにも行かなくなります

投稿2021/05/04 04:06

編集2021/05/04 04:13
y_waiwai

総合スコア88024

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

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

0

その場合データ損失はありませんね。
何を懸念されているのでしょうか?

投稿2021/05/04 03:46

itagagaki

総合スコア8402

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問