「夫を成功」へ導く妻の秘訣 座談会

システムコールって何でしょうか。
C言語初心者なので、変な質問だったら、すみません。

システムコールと標準ライブラリにおける、関数の違いを教えて頂けませんでしょうか。
例えばファイル入出力で用いる
openとfopenは何が違うのでしょうか?
私はそもそも、システムコールというものが判っていない状態です。
いつも標準ライブラリを参考にしていたものですから・・。

更に似た使い方をすると思いますが、使える範囲等どちらが広いのでしょうか。

よろしくお願いします。

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

A 回答 (4件)

システムコールは本来はOSが提供する機能をほぼそのまま呼び出すものです。

OSによっては呼び方が違うこともあります(スーパバイザコールとか)
ほぼ、と書いたのは実際には各言語から直接呼び出せるとは限らないからです。
だいたいはアセンブラレベルで定義されてます。

OSの機能そのままなので、OSによっては全く違いますし、該当する機能がない場合もあります。

openは本来 unix系のOSが提供する機能そのものです。
ですので、同じunix系であっても細かい違いがあります。
MS-DOS等でもopenはありますが、これは本来システムコールではなく、unix系OSのシステムコール互換ライブラリになります。

これに対して fopenはC言語レベルで共通に使えるように作られたサブルーチンで、
基本的にOS等に依存しないで使えるように作られたものです。
中身は勿論OSによって違ってきますが、使い方はほぼ同じです。
厳密にはパラメタの内容に違いがありますし、
動きもOSに依存する違いが出てくる場合もありますが。

C言語で書く場合は標準ライブラリのみ使用していると、OS等が違ってもほぼそのまま動くプログラムを書くことができますが、
システムコールを使った場合はまずOSが異なった場合は、
たいていなんらかの書き換えが必要になります。
但し、標準ライブラリだと共通に使うことが目的なため、用途によっては機能的に足らない場合もあります。

単純に使える範囲では標準ライブラリの方が広いですね。
機能としては似ている物もありますが、通常は使い方は区別する方がいいですね。

特に問題、不自由なければ標準ライブラリを使うことをおすすめします。
プログラムいろいろ作っていくとシステムコールでなければできない場合がありますから、
システムコールはその時に使えばいいでしょう。

例えば私はWindowsのプログラムを書く場合でも、通常 fopen等を使いますが、
必要な場合はFileCreate等(WIN32API,システムコールと同等)を使います。
    • good
    • 1

既に出ている回答で良いと思うのですが、他の回答者の方々が忘れておられる


かもしれない側面について補足しておきます。

UNIXは、タイムシェアリングシステム、すなわち1台のコンピュータを複数の
人が共有して使うやり方を想定して作られました。コンピュータを扱う人と
プログラマが同義語だった時代です。ある人の作ったプログラムが他の人の
プログラムを妨害しては困ります。ですので、共通の資源の管理、ディスクの
入出力とかプロセスの生成といったことは特権モードで一括して行うように
しました。ユーザーのプログラムは、この特権モードのルーチンを呼び出す
ことによって資源を割り当ててもらい、必要な処理を行います。これが
システムコールです。

一方、多くのプログラマが共通に使うルーチンだけれども、必ずしも特権を
必要としない処理もあります。数学の関数の計算などが代表的なものです。
入出力についても、物理的な入出力自体は特権が必要であっても、それに
関する処理、例えばバッファリングですとか出力文字列のフォーマッティング
などは特権を必要としません。ですので、これらの処理は非特権モードで
実行し、必要に応じて共通ルーチンの中からシステムコールを行うように
なっています。これが標準ライブラリのわけです。
    • good
    • 1

システムコールと標準ライブラリの違いは、プラットフォームによって話が違ってくるので、一概に「こう」とは言いきれないのですが。



元々、C言語は unix で使われていたので、まずはその部分から。

unix 上のCでは、システムコール関数を呼び出すと、渡されたパラメータをそのままカーネルシステムに渡し、結果が返って来るまで待って、アプリケーションに結果を返します。

ところが、unix には BSD 系の OS と SYSTEM-V 系の OS と2種類の体系があり、また、同じ系列の unix でも機種による違い(方言)があり、パラメータや結果の返り方が微妙に違っているシステムコールがあります。

そうなると、機種ごとの微妙な違いを吸収する為の「標準的な何か」が必要になって来ます。

そこで用意されたのが、標準ライブラリです。

標準ライブラリは、unix の体系ごと、各機種ごとに合わせた物が用意され、出入り口のインターフェースが統一されています。OS の仕様の違いはライブラリ関数内で吸収されます。

そうする事により、システムコールを使わず標準ライブラリのみ使っていれば、OS の仕様が微妙に異なるシステムに移植する作業が安易になります。
(実行ファイル作成時に、機種ごとに用意されたライブラリファイルのどれを使うか指定するだけで済みます)

ただ、標準ライブラリのみを使っていると、移植が安易になる反面、OS の仕様の違いを吸収する為のオーバーヘッドがあり、速度的に遅くなる、実行コードが大きくなると言う短所があります。

その為、速度重視、コードサイズ重視で設計する場合や、やりたい事が標準ライブラリに無くシステムコールするしか無い場合もあり、システムコール関数を使わずに済ます事は出来ません。

そういった経緯で、C言語にはシステムコール関数と標準ライブラリ関数の両方が存在します。

で、時代は unix から MS-DOS へと移って行きます。そして、C言語のシステムコール関数と標準ライブラリ関数の意味合いも、OS の違いと共に移り変わって行きます。

unix と MS-DOS では、カーネルシステムそのものがまったく違います。でも、unix 上で開発したソースコード資産を無駄にはしたくありません。

そこで、unix 用のシステムコール関数と同じような動きをする関数が MS-DOS 用のライブラリとして用意され、同じく、標準ライブラリ関数も用意されました。そうすれば、unix から MS-DOS への移植が容易になりますから。

つまり、OS の違いをシステムコール関数内で吸収してしまった訳です。標準ライブラリ関数が unix の微妙な違いを関数内で吸収したのと同じような事をした訳ですね。
(ファイルの「テキスト」「バイナリ」の概念も、ここで取り入れられました。unix と MS-DOS の「改行コード」の違いを吸収する為、テキストファイルを読む場合は CR+LF を LF に、書く場合は LF を CR+LF に変換する必要があったのです。アプリケーションは「改行は LF のみ」として作られている訳ですから)

そういった訳で、MS-DOS 用のC言語では、システムコール関数と標準ライブラリ関数の違いが曖昧になりました。どちらも「OS の違いを関数内で吸収し、インターフェースを統一している」訳ですから。

そんな訳で「システムコール(関数)と標準ライブラリ(関数)における、関数の違いって何?」と言う疑問が湧くのも当然です。
(Windows のコンソールアプリケーションを含む)MS-DOS 系では、パラメータが違うだけで、内部でやっている事は同じような事なのですから。

「使える範囲等どちらが広いか」ですが、ここまで読んでお判りかと思いますが、標準ライブラリ関数の方が機種依存性は低く広範囲に使えます。但し、痒い所に手は届きません(汎用性を重視している為、最大公約数的な事しか出来ません)

で、時代は MS-DOS から更に Windows へと進む訳ですが、ここで話は一変してしまいます。そう、GUIの登場です(unix にもGUIはあるのですが、ここでは割愛)

GUIの登場により、コンソールが使われなくなり、その変わりにウィンドゥ、マウスなど、グラフィカルな部分を扱う関数や、プロセス制御を行ったり、イベントを処理する必要が出て来ました。

その為、今までのシステムコール関数と標準ライブラリ関数は忘れ去られ、変わりにAPI関数が登場しました。

C言語そのものも、GUIを扱いやすくする為、クラスの概念を導入し、クラスの階層化を行ってC++に進化して来ました。

以上、長文になりましたが、回答になっているでしょうか?
    • good
    • 2

システムコールはunixの世界で用いられるものです。


unix以外の環境でもunixシステムコール互換のライブラリが用意されている場合が多いと思いますが、、、

システムコールは、OSの機能を直接さわるものですので、OSによって異なる部分があったりします。標準ライブラリは、環境による差異を吸収し、どんな場合でも同じように使えるように、かつ使いやすいように設計されています。

初心者とのことですので、どうしても必要でなければシステムコールは使わずに、なるべく準ライブラリをお使いになることをおすすめします。
    • good
    • 0

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

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

Qセマフォとmutexの違いは?

排他制御としてセマフォとmutexがありますが、
この二つの違いがよくわかりません。
自分で調べてみたところ、
・セマフォ…プロセス間排他制御。複数ロックがかけられる。
・mutex…スレッド間排他制御。ロックは一つだけ。

と言うような違いがあるようなのですが、これだけの差なんでしょうか?
(これだけの差、と言ってる時点で筋違いだったら申し訳ありません)
また、セマフォをスレッド間排他制御に用いたり、
mutexをプロセス間排他制御に用いることは可能なのでしょうか?
可能だとしたら、これらが2種類存在する理由も教えていただきたいです。

Aベストアンサー

> >一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。
> とのことですが、これはWin32以外の環境だと
> これ以上の違いはないと言うことでしょうか?

「一般論」と書いた意味を取り落とされているのではないかと思います。

「一般論としては〇〇」なのですから、「Win32以外の環境」も含めて「各論」では「必ずしも〇〇とは限らない」とご理解ください。

なお、ご指摘のとおり、あるリソースを排他的に利用するだけであればMutexを使用するかわりにカウントが1のSemaphoreを使用することができます。(特定の環境での、MutexとSemaphoreの環境依存の動作を除けば、ですが。)

ではなぜ2種類が用意されている(用意されている環境が存在する)のかといえば、リソースの排他的利用は非常によくあることなので、これに特化した機能を用意すればより良いであろう、というシステムデザイナの判断によるものと考えられます。

ここで言う「より良い」は、あるデザイナにとっては「便利性」、また別のデザイナにとっては「消費リソースが少ない」と、これまた考え方はいろいろでしょう。

> >一般論としては、Mutexは「カウントを1に限定した」特殊化したSemaphoreです。
> とのことですが、これはWin32以外の環境だと
> これ以上の違いはないと言うことでしょうか?

「一般論」と書いた意味を取り落とされているのではないかと思います。

「一般論としては〇〇」なのですから、「Win32以外の環境」も含めて「各論」では「必ずしも〇〇とは限らない」とご理解ください。

なお、ご指摘のとおり、あるリソースを排他的に利用するだけであればMutexを使用するかわりにカウントが1のSemaphore...続きを読む

Qint型からchar型への変換

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

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

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

Qfgetsで拾われる改行文字を削除したい

お世話になります

 C言語初心者のものです。今課題でC言語を用いたプログラミングを
Fedora上でやっています。問題は、fgetsでテキストファイルから、取得
した文字列の中から改行文字を削除できないことです。文字変数のアド
レスはわかっているのですが、終端文字に置換しようとすると、セグメ
ントエラーになってしまいます。これは如何にして解決すべきでしょう
か。よろしくお願いします。

Aベストアンサー

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが最大文字数に達したり、ファイルの最後になったりで、strに改行文字が含まれない場合には、このループは止まりません(Segmentension Falutになって止まる)

・そのような状態になってないか、予めチェックする
・ループを終了させる仕組みを用意しておく
: forの終了条件を記述する、for中で if(*(str+i)=='\0') { break;} 等としておく、等
といった対策が必要です。


あと細かいところを言えば
・strを配列で用意したなら *(s+i)じゃなくてs[i]でいいんじゃないかな
・あるいは char *pみたいにしておいて、 iのループでなく pでループを組む( for(p=str;*p!='\0';p++) )とか。

ポインタとかアドレスとか、C言語の用語としてあるものを別の意味に使うとまぎらわしいです。

「ポインタ」「アドレス」と言われたら、 この例なら str, str+i が思い浮びます。
「文字変数のアドレス」だと
char c ;
に対しての
&c
が思い浮びます。

配列なら「添字」、意味的には「x文字目」ですね。

> for(i=0;;i++){
> if(*(str+i)=='/n') {
> *(str+i)='\0';
> break;
> }
> }
/nが\nの間違いなら、この方法で半分正解です。もう少し広い範囲(可能なら全体)で見ないことにはなんとも言えません。
fgetsが...続きを読む

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) {
// ここに処理を書く
}
という関数が必要なようです。

QをVisualStudioでつかえるようにする

<unistd.h>をVisualStudioでつかえるようにしたいのですが、問題なくコンパイルできるようにするにはどうしたらいいでしょうか?

CygwinというやつをインストールしてやってみたのですがやはりVisualStudioだけでコンパイルしてやりたいのですが。。。。

Aベストアンサー

おそらく<unistd.h>をフルスペックで利用したいわけではないと思います。その中の一部の関数を使いたいだけなら<io.h>などで代用できるはずですから、ヘルプで調べてみることをお勧めします。

ソースを修正せずに、コンパイル&実行ができるようにすることは諦めた方がよいと思います。

移植のことを考えるなら、<unistd.h>とか<windows.h>のような環境に特化したヘッダや、そこで宣言される型や関数などを直接使うのではなく、適切にラッピングしてから使う方が後々楽です。今回は仕方ないでしょうが、今後はそうしましょう。

Qsys/types.hの必要性について

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
int main (int argc,char *argv[])
{
struct stat buf[2],*p;
    if(argc!=3)
{
fprintf(stderr,"Usage:newer file1 file2\n");
exit(EXIT_FAILURE);
}
p=buf;
if(stat(argv[1],p)<0)
{
perror("stat");
exit(EXIT_FAILURE);
}
p++;
if(stat(argv[2],p)<0)
{
perror("stat");
exit(EXIT_FAILURE);
}
if(buf[0].st_mtime>buf[1].st_mtime)
{
printf("%s\n",argv[1]);
}
else
{
printf("%s\n",argv[2]);
}
return EXIT_SUCCESS;
}
上記のプログラムでは<sys/types.h>を使っていますが、
どこの部分で必要になるのでしょうか?
プログラム貼り付けて非常に見づらくてすいません

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
int main (int argc,char *argv[])
{
struct stat buf[2],*p;
    if(argc!=3)
{
fprintf(stderr,"Usage:newer file1 file2\n");
exit(EXIT_FAILURE);
}
p=buf;
if(stat(argv[1],p)<0)
{
perror("stat");
exit(EXIT_FAILURE);
}
p++;
if(stat(argv[2],p)<0)
{
perror("stat");
exit(EXIT_FAILURE);
}
if(buf[0].st_mtime>buf[1].st_mtime)
{
printf("%s\n",argv[1]);
}
el...続きを読む

Aベストアンサー

statに必要です。
仮に、<sys/types.h>をインクルードせずにコンパイルでき、動作に問題がないとしても移植性に問題が出ます。
仕様で<sys/types.h>のインクルードが要求されているのであれば、「たまたま」コンパイル・実行できることに期待せず、要求に従いましょう。

Qシンボルが見つかりませんというエラーが理解できません。

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Image[3];
Thread t;
int index1 = 0;
int index2 = 0;
String msg = "";
String msg1 = "";

boolean state = false;
Button b1 = new Button("ぐー");
Button b2 = new Button("ちょき");
Button b3 = new Button("ぱー");

public void init(){
for(int i = 0; i<=2; i++){
img[i] = getImage(getDocumentBase(),"hanabi" + (i+1) + ".JPG");
}
add(b1);
add(b2);
add(b3);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
msg1 = "結果は・・";

}

public void paint(Graphics g){
g.drawImage(img[index1],350,30,this);
g.drawImage(img[index2],695,30,this);
g.drawString("コンピューター",420,300);
g.drawString("あなた",800,300);
g.drawString(msg,630,320);
g.drawString(msg1,550,320);
}

public void start(){
state = true;
t = new Thread(this);
t.start();

}

public void run(){
while(state){
index1++;
if(index1 == 3){
index1 = 0;
}
index2++;
if(index2 == 3){
index2 = 0;
}
repaint();
try {
Thread.sleep(60);
}catch(InterruptedException e) { }
}
}

public void actionPerformed(ActionEvent e){
if(state == false) {
start();
return;

}
state = false;
if(e.getSource() == b1) {
msg = "ぐー";
index2 = 0;
}

else if(e.getSource() == b2){
msg = "ちょき";
index2 = 1;
}

else if(e.getSource() == b3){
msg = "ぱー";
index2 = 2;
}
check();
repaint();
}

public void check() {
if(index1 == index2) msg ="あいこ";


else if (index1 == 0) {
if(index2 == 2) msg="あなたの勝ち";
else msg ="あなたの負け";
}

else if(index1 == 1) {
if(index2 == 0) msg="あなたの勝ち";
else msg="あなたの負け";
}

else if(index1 == 2) {
if(index2 == 1) msg="あなたの勝ち";
else msg="あなたの負け";
}

}
}

以下のようなじゃんけんゲームのプログラムを書いたのですが、「シンボルが見つかりません。」というエラーが表示されるのですが、エラーの意味が理解できず、解決できません。どこが間違っているのか教えていただけませんか。

import java.applet.Applet;
import java.awt.*;
import java.awt.event.*;
import java.io.File;

public class janken extends Applet
implements Runnable, ActionListener {
private static final int EXTERNAL_BUFFER_SIZE = 128000;

Image image[] = new Imag...続きを読む

Aベストアンサー

「シンボルを見つけられません。」というエラーの下に何か表示がありませんでしたか?そこにヒントがあると考えられます。
シンボルを見つけられませんといエラーが表示される主な理由は4つあります。
(1)クラス、メソッド、変数などの綴りミスや定義していない変数を使用している可能性がある。
(2)コンストラクタを呼び出すときに、newを忘れている可能性がある。(3)公開されていないメンバーを呼び出している可能性がある。
(4)必要なimport文を記述し忘れている可能性がある。
ここでのあなたのエラーは(1)番ではないでしょうか?上記ではimageとなっている変数がimgになっていますね。
これはエラー表示をよく見ることで意外と簡単に解決できるのです。
ゆっくり丁寧にエラー表示を見るように心がけることが大事ですよ。

Qprintf で二進表示を行いたい。

すみません。教えていただきたいことがあります。
printf で普通のintの値をフォーマット指定子を使用して二進表示をしたかったのですが見当たりませんでした。
どうにかintの内容を二進で確認したいのですが、どのようにすれば良いですか?
宜しくお願いします。

Aベストアンサー

★2進整数を表示する関数を自作すればよい。
・作り方は簡単で、最上位ビットから順に『0』と『1』を調べていき、ビットが
 立っていれば『putchar('1');』にして、ビットが OFF なら『putchar('0');』
 にすれば良いでしょう。
・下にサンプルを載せますので使いやすいように改良して下さい。

サンプル:
unsigned int bit = (1 << (sizeof(int) * 8 - 1));
int value = 12345; ←これが表示したい int 型の整数値です。

printf( "value の 2進表記は " );

for ( ; bit != 0 ; bit >>= 1 ){
 if ( value & bit ){
  putchar('1');
 }
 else{
  putchar('0');
 }
}
printf( " です。\n" );

最後に:
・1バイトが 8 ビットの環境が前提です。→まぁ、普通は 8 ビットですが…。
・上記のサンプルを関数などにすれば使いやすくなります。→print_bin()など
・以上。おわり。

★2進整数を表示する関数を自作すればよい。
・作り方は簡単で、最上位ビットから順に『0』と『1』を調べていき、ビットが
 立っていれば『putchar('1');』にして、ビットが OFF なら『putchar('0');』
 にすれば良いでしょう。
・下にサンプルを載せますので使いやすいように改良して下さい。

サンプル:
unsigned int bit = (1 << (sizeof(int) * 8 - 1));
int value = 12345; ←これが表示したい int 型の整数値です。

printf( "value の 2進表記は " );

for ( ; bit != 0 ; bit >>= 1 ){
 if...続きを読む

QC言語 配列の長さの上限

C言語で配列Array[N]の長さNの上限っていくらなんでしょうか?
もし可能なのであれば上限を2147483647にしたいのですが、方法を教えてください。

Aベストアンサー

そもそもWindowsの32bit版はアプリが仮想メモリ空間を2GBしか使えません。2GBを超えるには64bit版が必要です。
たとえ64bit版OSだとしても添え字が2147483647って、単純なintの配列だとしても4x2147483647=8GB必要ですね。実メモリ16GBとかのPCを用意しますか?
そもそも配列で2147483647個必要なアルゴリズムに問題ありだと思います。

QWindowsのシステムコール呼び出し

アセンブラでシステムコールを呼び出したいのですが、
Linuxとかだとシステムコールの一覧みたいのが載ってるのですが、
Windowsのシステムコールの一覧みたいのが見つかりません。

一覧が載っているようなサイトってありませんか??
とりあえずLinuxの11番(C言語で言うexecv関数)みたいのが使いたいのですが。。。

Aベストアンサー

MS-DOSシステム割り込みの一覧です。

参考までに、どうぞ。

Ralf Brown's Files
http://www.cs.cmu.edu/afs/cs/user/ralf/pub/WWW/files.html

Ralf Brown's Interrupt List
http://www.delorie.com/djgpp/doc/rbinter/


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング