整数の変換

C/C++セキュアコーディングを読んでのメモ



char型の変数に数値を代入し, その範囲を越える量の値が変数に入るようにプログラムを書くと, char型はint型に格上げされるらしい.
ちょっとプログラムを書いてテスト.

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

int main( int argc, char *argv[] )
{
  char c1 = CHAR_MAX;
  char c2 = CHAR_MIN;
  char c3 = 1;

  printf( "CHAR_MAX : %4d\n", CHAR_MAX );
  printf( "CHAR_MIN : %4d\n", CHAR_MIN );
  printf( "c1       : %4d\n", c1 );
  printf( "c2       : %4d\n", c2 );
  printf( "c3       : %4d\n", c3 );
  printf( "c1 + c3  : %4d\n", c1 + c3 );
  printf( "c2 - c3  : %4d\n", c2 - c3 );

  return 0;
}

これをコンパイルしてみると, 何のエラーもなく通る.
実行結果がこれ↓.

[khiker@khlin001 ~/<1>c/secure]$ gcc -Wall test_over.c -o test_over
[khiker@khlin001 ~/<1>c/secure]$ ./test_over
CHAR_MAX :  127
CHAR_MIN : -128
c1       :  127
c2       : -128
c3       :    1
c1 + c3  :  128
c2 - c3  : -129

確かにcharの範囲を越えているのにちゃんと代入でき, 表示できている.
変数の型が何か分かるような関数か何かがあったら, c1 + c3 や c2 - c3 の型が char から int に格上げされたかを確認できるのに.
無いのかな?