gooID利用規約 改定のお知らせ

if(-10<1u)の条件判定はunsigned型で評価され偽となります。
int型 unsigned int型とも32ビットで考えたとき、
1u = 0x00000001 -10 = 0xfffffff6で10進法では4294967286になります。
条件判定をunsigned型で考えれば確かに-10<1uは偽になり
int型で考えれば-10<1uは真になります。
「通常の算術変換」によれば、「一方のオペランドがunsigned int型をもつ時、他のオペランドをunsigned int型に型変換するとあります。」
よって、if(-10<1u)の条件判定はunsigned型で評価され偽となりますが、
「一方のオペランドがint型をもつ時、他のオペランドをint型に型変換する。」では何故いけないのでしょうか?
宜しく願います。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

> <符号無し整数型から符号付き整数型に変換する際、元の値が表現できなければ、>


> とは、具体的にどのような場合をいうのでしょうか?

例えば、

unsigned int a = UINT_MAX;
int b = (int)a;

とした場合、aの値はUINT_MAXであり、int型の表現範囲に収まりません。
具体的には、int型が32ビットで負値を2の補数で表現する処理系であれば、int型の表現範囲は-2147483648~+2147483647になりますから、UINT_MAXの値(4294967295)を表現することができません。

> <処理系定義の値になるか処理系定義のシグナルが発生します。>

int型の負値の表現方法は、2の補数以外に、1の補数や符号ビット+絶対値が考えられます。これらの場合にUINT_MAXをint型にキャストするとどんな値になるか考えてみてください。
処理系定義のシグナルというのは、例えばオーバーフロー例外(プロセッサがハード的に発生させる割り込みのようなものと考えてください)が発生して、結果として何らかのシグナルハンドラが呼び出されるかもしれないことを意味しています(シグナルハンドラについてはsignal関数を調べてください)。
    • good
    • 0
この回答へのお礼

大変詳細なご説明有難うございました。やっと理解する事ができました。
今後ともよろしく願います。

お礼日時:2008/10/15 06:43

ひとつ確実にいえることは、符号付き整数型から符号無し整数型に変換する場合の振る舞いは明確に規定されていますが、逆はそうではないということです。


すなわち、符号無し整数型から符号付き整数型に変換する際、元の値が表現できなければ、処理系定義の値になるか処理系定義のシグナルが発生します。
その意味では、符号付き整数型を符号無し整数型に変換する仕様の方がずっと無難です。

この回答への補足

<符号無し整数型から符号付き整数型に変換する際、元の値が表現できなければ、>
とは、具体的にどのような場合をいうのでしょうか?

<処理系定義の値になるか処理系定義のシグナルが発生します。>
とは、なにをさすのでしょうか?
初心者ゆえ、はっきりとわかりません。
ご教授願います。

補足日時:2008/10/14 16:11
    • good
    • 0

これは、どちらに合わせたところで不都合が出るケースがあることに変わりはなく「どちらでもよかった」類の仕様だと思います。


#符号付きに合わせた場合はUINT_MAX > INT_MAXが偽になりますよね?

が、「実装によりまちまちになっていると困る」ものでもあるので、「符号なし側に合わせる」と仕様を定めたのでしょう。
符号なしに合わせた理由は何かあるかもしれませんが、最初に書いた通りどちらでも不都合が起きることには変わりないのであまり深く突っ込んでも仕方ないと思いますよ。
#仕様ってのはそーゆーモノも含んでる訳で。
    • good
    • 0

難しく書いてますが、「左に習え」って規則があります。


例えば、
int *P ;
P = (unsigned int *)U :

これは、PとUのどっちが間違いですか?
そんなことと、思います。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q複数桁10進数の*桁目だけを抽出したい

タイトルがすべてと言えてしまうのですが、
例えば、int宣言された"4287"(この値は変動します)という数値があったとして、1桁目の"7"だけを別の変数へ引き抜きたいのですが、その場合にはANDによるマスク処理による演算で処理可能なのでしょうか?
また、他に良い方法などありましたら教えていただけますでしょうか?

Aベストアンサー

★10進数ですので AND は使えませんね。
・簡単なサンプルを載せますので読み取って下さい。

サンプル1:
int value = 4287;
int a[ 4 ];

a[0] = (value % 10); value /= 10; // 1桁目を取り出す
a[1] = (value % 10); value /= 10; // 2桁目を取り出す
a[2] = (value % 10); value /= 10; // 3桁目を取り出す
a[3] = (value % 10); value /= 10; // 4桁目を取り出す

サンプル2:
int value = 4287;
int a;

a = (value % 10);
value -= a;

value → 4280
a → 7
になります。

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

QC ファイル出力で、フォルダがない場合でも作成する方法

先日、皆さんに教えていただき

Cで出力ファイルを指定のフォルダに出す方法が上手く出来ました。
具体的には、↓こうやって指定しました。
sprintf( buff, "%s\\%s", path, filename );

やっていて思ったのですが、
この方法だと、指定フォルダが最初から無いとエラーが出てしまいます。
フォルダが無かったら、作成し、その中にファイルを出力していってくれる。という方法はできるものなのでしょうか?

もしできるようなら教えて下さい!!
よろしくお願いします!

Aベストアンサー

★回答ではないが余談。
・koko_u_ さんありがとう。
 気づくとアンダーバーの関数名で置き換わっているみたいですね。
 他にも気づくといろいろ置き換わっていますね。
 C 関数、最近使っていないのでアンダーバーの関数名で調べてみます。
・ありがとうございました。

●質問者さんへ。
・_mkdir() 関数が使える場合はその関数でもフォルダ(ディレクトリ)が作成できます。
 それでは。

参考URL:http://www5c.biglobe.ne.jp/~ecb/c/12_14.html

Qfgetsなどのときのstdinのバッファを消すには?

こんにちは,今C(C++でない)を使用しています。
たとえば,
char str[20]
fgets(str,sizeof(str),stdin)
としたときに20字以上を打つと,stdinのバッファに20字以上の分が残ったままになります。

C++などでは
fflush(stdin)で,うまくいきますが,普通のCでは対応がされていないみたいでうまくいきません。

よろしくお願いします。

Aベストアンサー

あ,テキスト入力だからこんな大掛かりなことしなくてもいいんだ.
末尾に'\n'が出るまで掃出せばいいんですよね.

fgets(str, sizeof(str), stdin);
if ( str[strlen(str)-1] != '\n' ){
while( getchar() != '\n' );
}

でいいんだ.失礼しました.

Q定数の定義方法 #define

いつもお世話になっております。

定数を定義したいのですが、
その数値が符号無し長整数の場合どのように
定義すれば宜しいのでしょうか。
符号有りの場合は特に指定しなくても宜しいのですか。

どうぞ宜しくお願いします。

Aベストアンサー

マクロ定数には型はないですが、プリプロセッサで解釈されるときに
型が問題になります。
X3010(CのJIS規格) §6.1.3.2では「整数定数の型はその値を
表現できる最初(int以上の小さい型から最初)の型とする」となってます。
だから#define A 1と書くと、解釈時にAの型はintになり、
intで表現できない数を書くとlong intになります。
その値を使って計算をすると、結果が異なってくる可能性があります。
(たとえば、long intだと桁あふれのしない計算が、intだとあふれるとか)

その数値がunsigned long intであることが必要ならば、
数値の最後にULをつけることで型を指定できます。

#define A 1UL

Qsize_t

ライブラリ関数を勉強しているのですが、
書式にたとえば
callocならvoid *calloc(size_t nmemb, size_t size);
という風に書いていますが、
size_tってなんですか?
書式が読めないと、、、わからないです。
あと最初にvoidと書いていますが、
返ってくるのはポインタなのだから
intじゃないんですか?
お願いします。

Aベストアンサー

もしプラットフォームがwindowsでVCをお使いであればMSDNを参照してみるのもいい方法だと思います。

確認したところsize_tはunsigned int型のようですね。
STDDEF.Hに以下の記述を見つけました。
#ifndef _SIZE_T_DEFINED
typedef unsigned int size_t;
#define _SIZE_T_DEFINED
#endif

意味が存在しない「型」「数字」に意味をもたせると言う事はプログラムをする上で避けて通れないところだと思います。
(unsigned intと書いてあるよりはsize_tと書いてあるほうが「見た目に解りやすい」ですしね。もちろん一番の目的はOSの違いを吸収するためでしょう)

また、
void * calloc(size_t nmemb, size_t size);

* calloc();
こうすると理解しやすくありませんか?
ポインタ(*)が返される関数。但し、ポインタが指し示す先は未定義(void)。
尚更解りにくくしてしまったらすみません。

もしプラットフォームがwindowsでVCをお使いであればMSDNを参照してみるのもいい方法だと思います。

確認したところsize_tはunsigned int型のようですね。
STDDEF.Hに以下の記述を見つけました。
#ifndef _SIZE_T_DEFINED
typedef unsigned int size_t;
#define _SIZE_T_DEFINED
#endif

意味が存在しない「型」「数字」に意味をもたせると言う事はプログラムをする上で避けて通れないところだと思います。
(unsigned intと書いてあるよりはsize_tと書いてあるほうが「見た目に解りやすい」ですしね。...続きを読む

Qprintf による16進表示について

C言語初心者です。

今作っているプログラムで、データを16進形式で表示しようとしています。
大体このような感じです。

/*入力時*/
char buf[5]={0x4e,0x94,0xa0,0x2b,0x78}

/*出力時*/
for (i = 0; i < 5; i++) {
printf("0x%02x\n",buf[i])
}

実際には入力後にある処理によってbufは更新されるのですが、printfの出力結果として、

0xffffff4e
0x94
0xffffffa0
0x2b
0x78

というように、'ffffff'が付加したものがいくつか出力されてしまいます。
これはどういった意味を持つのでしょうか?

なんか初心者ならではの漠然とした質問ですいません。。。

Aベストアンサー

出力は、
0x4e
0xffffff94
0xffffffa0
0x2b
0x78
ではありませんか?
char が符号付(-128~127)のため、0x80~0xffは負の数とみなされます。printfの引数になる時に 符号付charは符号付intに変換されますが、このCコンパイラの場合は、int が4バイトcharが1バイトのため、上位3バイトに負の数を示すffffffが入ります。
char x=255;
printf("%d\n",x);
だと255でなく、-1が表示されます。

対応としては、
unsingned char buf[5]={0x4e,0x94,0xa0,0x2b,0x78}
;
とするか、
printf("0x%02x\n",buf[i]&0xff);
にするかどちらかですね。

Qヒープメモリの解放について

すみません教えてください。
VCを始めたばかりで、メモリ等の事が良くわかりません。
(2)で、Invalid Address specified to RtlValidateHeap( 340000, 344978 )やHEAP: Free Heap block 344970 modified at 344998 after it was freed
のメモリエラーが出力されます。
調べてみると(1)で解放されていないのですが、delete pBufが処理されていないと思います。
記述等に問題があるのでしょうか? 調べてみると問題ないように思えるのですが・・・ ご存知の方教えてください。


<ソース>
HANDLE hEventLog = NULL;
EVENTLOGRECORD *pBuf = NULL;

/* イベントログのオープン処理 */




/* イベントログの最大数 */
bResult = GetNumberOfEventLogRecords(hEventLog, &EventNum);

//最大サイズを取得
BufSize = 1;
pBuf = new EVENTLOGRECORD;

bResult = ::ReadEventLog(hEventLog,EVENTLOG_FORWARDS_READ | EVENTLOG_SEQUENTIAL_READ,0,pBuf,BufSize,&ReadBytes,&NextSize);
if(!bResult && GetLastError() != ERROR_INSUFFICIENT_BUFFER) {
 eMsg = "ファイルリードエラー2" ;
 CloseEventLog(hEventLog);
 delete pBuf;
 return -1;
}
delete pBuf; --->(1)メモリが解放されない。

BufSize = NextSize;
bResult = ::ReadEventLog(hEventLog,EVENTLOG_FORWARDS_READ | EVENTLOG_SEQUENTIAL_READ,0,pBuf,BufSize,&ReadBytes,&NextSize);

if(!bResult && GetLastError() != ERROR_INSUFFICIENT_BUFFER){
 eMsg = "ファイルリードエラー3";
 CloseEventLog(hEventLog);
 delete pBuf;
 return -1;
 }
}

delete pBuf; --->(2)ここでエラー

すみません教えてください。
VCを始めたばかりで、メモリ等の事が良くわかりません。
(2)で、Invalid Address specified to RtlValidateHeap( 340000, 344978 )やHEAP: Free Heap block 344970 modified at 344998 after it was freed
のメモリエラーが出力されます。
調べてみると(1)で解放されていないのですが、delete pBufが処理されていないと思います。
記述等に問題があるのでしょうか? 調べてみると問題ないように思えるのですが・・・ ご存知の方教えてください。


<ソース>
HANDLE hEventL...続きを読む

Aベストアンサー

ちょっと順番が前後しますが、

>コンパイルしても定義されていない見たいだし、MSDNで調べてもLPEVENTLOGRECORDが無かったものですから・・

すみません。PEVENTLOGRECORDの間違いですね。
EVENTLOGRECORD*のことです。


という前提で、

>これはヒープメモリがオーバーしたため足りない60サイズを要求しているって意味ですよね?

そうです。

>だとすると、記載してあった
>char * pBuf2 = new char[NextSize];
>pBuf = (LPEVENTLOGRECORD)pBuf2;
>で確保するのでしょうか?

そうなります。


>また、なぜchar型でメモリ領域を作成し、
>EVENTLOGRECORD型でpBufにキャストするのでしょうか?
>pBufはEVENTLOGRECORDですよね?

new EVENTLOGRECORD;
で確保可能な領域は、EVENTLOGRECORDのサイズを単位としてしか確保できませんよね。
charであれば、1バイト単位で必要なサイズ分を確保することが可能なのでこのような方法を取ります。

ちょっと順番が前後しますが、

>コンパイルしても定義されていない見たいだし、MSDNで調べてもLPEVENTLOGRECORDが無かったものですから・・

すみません。PEVENTLOGRECORDの間違いですね。
EVENTLOGRECORD*のことです。


という前提で、

>これはヒープメモリがオーバーしたため足りない60サイズを要求しているって意味ですよね?

そうです。

>だとすると、記載してあった
>char * pBuf2 = new char[NextSize];
>pBuf = (LPEVENTLOGRECORD)pBuf2;
>で確保するのでしょうか?

そうなります...続きを読む


人気Q&Aランキング

おすすめ情報