C言語 | キャストするとどうなるの? (long型→int型、int型→long型の変換)

予告していたとおり、「キャストするとどうなるの?」という疑問を解消するためにテストプログラムを作って動かしていこうと思います。

先ず、キャストとは何かというと、
プログラムにおいて、あるデータ型を他のデータ型に変換することです。

では、キャストすると何が起きるの?
値をそのままでデータ型のみが変更されます。
小数を扱うシステムはそこまで多くないと思っていますので、
今回は整数を格納するデータ型int型、long型を使用して
実際に変換するプログラムを2つ作成しました。

実行環境は以下に記載しているので参考にしてください。
https://programing-experiment.hatenablog.jp/entry/2019/02/16/010421


例1:int型(32bit) → long型(64bit)

#include <stdio.h>

int main (void)
{
	long value_long;
	int value_int;

	/* int型(32bit) → long型(64bit) */
	value_int = -1;
	value_long = (long)value_int;
	printf("int: %d(0x%08x), long: %ld(0x%016lx)\n", value_int, value_int, value_long, value_long);

	value_int = 1;
	value_long = (long)value_int;
	printf("int: %d(0x%08x), long: %ld(0x%016lx)\n", value_int, value_int, value_long, value_long);


	return (0);

}

実行結果(括弧の中は16進数表記)
int: -1(0xffffffff), long: -1(0xffffffffffffffff)
int: 1(0x00000001), long: 1(0x0000000000000001)

例2:long型(64bit) → int型(32bit)

#include <stdio.h>
#include <limits.h>

int main (void)
{
	long value_long;
	int value_int;

	/* long型(64bit) → int型(32bit) */
	value_long = LONG_MAX;
	value_int = (int)value_long;
	printf("long: %ld(0x%016lx), int: %d(0x%08x)\n", value_long, value_long, value_int, value_int);

	value_long = 0x123456789abcde56;
	value_int = (int)value_long;
	printf("long: %ld(0x%016lx), int: %d(0x%08x)\n", value_long, value_long, value_int, value_int);


	return (0);

}

実行結果(括弧の中は16進数表記)
long: 9223372036854775807(0x7fffffffffffffff), int: -1(0xffffffff)
long: 1311768467463790166(0x123456789abcde56), int: -1698898346(0x9abcde56)

例2の実行結果の2行目を見るとlong型→int型の変換を行った際に符号も含めて値がごろっと変わってしまいました!!
キャスト後のデータサイズがキャスト前のデータサイズより小さい場合はキャストにより意図しない値に変わる場合があります。
私の環境ではlong型の値16進数表記での後半半分が表示されました。
(詳しい人は下位4バイトと言うかもしれません。)
int型で表現できない値を格納している時にint型にキャストすると意図しない値となりますのでint型の変数にlong型の値を代入する場合はご注意下さい。


今回はint型→long型、long型→int型の変換をするプログラムを作成し、変換結果を観察しました。
次回はポインタ変数のキャストについて書こうと思っています。