キャストの警告が出ない

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
sadora3
記事: 175
登録日時: 6年前

キャストの警告が出ない

#1

投稿記事 by sadora3 » 1年前

タイトルにある通り、キャストに関する警告が出てくれません。
Bill.SubAlpha(255 / 50);
と、記述して、キャストの警告が出るんだろうなと思いつつ、ビルドしてみたら、警告が出ませんでした。
SubAlphaのプロトタイプ宣言は次のようになってます。
void SubAlpha(const unsigned char _Alpha);
これ、double型から、unsigned char型への変換ですよね?
なぜ、警告がでなかったのでしょうか?
警告レベルを4にしてみて、リビルドしても警告は出ませんでした。

おかしいなと思ったので、
void F(int a);
と宣言し、
F(0.05f);
このようにしたら、「floatからintへの変換です」と出てくれました。
上記のdouble型から、unsigned char型への変換の警告が出ない理由がサッパリ分かりません。
誰か詳しい方回答お願いします。

OS:Windows10
コンパイラ:VisualStudio2010
言語:C++
ライブラリ:DirectX SDK June2010、自作ライブラリ

アバター
へにっくす
記事: 628
登録日時: 6年前
住所: 東京都

Re: キャストの警告が出ない

#2

投稿記事 by へにっくす » 1年前

これ参考になりますか。

コード:

#include <stdio.h>


int main(int , char*[]) {
	double x = 0;
	x = 1/5;
	printf("%lf\n", x); // 整数で除算
	x = 1.0/5.0;
	printf("%lf\n", x); // 浮動小数で除算
	
	unsigned char c = x;
	printf("%d\n", c); // unsigned char
}
VS2015のcl.exeでの結果です。

コード:

C:\Users\guest\Documents>cl /W3 1.cpp
Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24210 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

1.cpp
1.cpp(11): warning C4244: '初期化中': 'double' から 'unsigned char' への変換です。データが失われる可能性があります。
Microsoft (R) Incremental Linker Version 14.00.24210.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:1.exe
1.obj

C:\Users\guest\Documents>1
0.000000
0.200000
0

C:\Users\guest\Documents>
警告オプション /W3 を指定すると、unsigned charに格納する箇所で警告が出ます。
指定しないと警告が出ません。

また整数型の除算は商が入るんですね。
計算の結果、型の違いがあっても警告は出ないみたいです。

参考になるかもしれないページ→キャスト演算子
written by へにっくす

sadora3
記事: 175
登録日時: 6年前

Re: キャストの警告が出ない

#3

投稿記事 by sadora3 » 1年前

なるほど!わかりました!
1/5は0になってしまうんですね。昔勉強したのに、忘れてました・・・。
こちらのコンパイラで、
unsigned char c = 1/5.0;
unsigned char d = 1/5;
これが、上は警告が出てくれるのに対して、下は警告がでないのを確認できました。
回答ありがとうございました。

返信

“C言語何でも質問掲示板” へ戻る