マガジンのカバー画像

C言語

63
C言語に関するあれこれ
運営しているクリエイター

#コンパイラ

何故 ARM だと char が unsigned になるのか

何故 ARM だと char が unsigned になるのか

タイトル通りです。

signed char ではなく
unsigned char でもなく
プレーンで char 型を使ったときに
何故 ARM だと unsigned で展開されるのか

従来、C言語では、
『unsigned も signed も指定しない場合、 signed である』
というのが一般的でした。

unsigned も signed も指定しないプレーンな char を使用し

もっとみる
【C言語】char が signed とは限らなかったという話 (C言語のおおらかな仕様に右往左往する日々)

【C言語】char が signed とは限らなかったという話 (C言語のおおらかな仕様に右往左往する日々)

発端こちらの記事でご指摘頂いたことが始まりでした。

ご指摘内容は、次のコードが無限ループになっているというもの。

char c;for (c = 1; c < 0x80; ++c)

char の範囲が
-128 ~ 127
であるとするならば、それは常に
0x80 = 128
よりも小さくなります。

このため、次の条件は必ず真であり、偽になることがありません。

c < 0x80

ただ、

もっとみる
C言語コンパイラ依存した話の続編「clang はどうコンパイルするのか」

C言語コンパイラ依存した話の続編「clang はどうコンパイルするのか」

こちらの記事の延長戦です。

というわけで(どういうわけ?)、 clang コンパイラが吐き出したアセンブラを解析してみました。

結論から言うと、clang コンパイラの場合は次のようになります。

引数 i 、 j は三項演算する前に待避しておく。

「j--」(後置デクリメント)は、 j-- する前の値を別のレジスタに待避する。

まず、clang が出力したアセンブラを見てみます。スマホ版

もっとみる
C言語って何? 標準関数を使ってみる

C言語って何? 標準関数を使ってみる

それでは、その「標準関数」です。

<assert.h>

assert

<complex.h>

cacos

cacosf

cacosl

casin

casinf

casinl

catan

catanf

catanl

ccos

ccosf

ccosl

csin

csinf

csinl

ctan

ctanf

ctanl

cacosh

cacoshf

cac

もっとみる
【C言語】コンパイラが何をしているのか、ちょっとのぞいてみよう その3 コンパイル

【C言語】コンパイラが何をしているのか、ちょっとのぞいてみよう その3 コンパイル

C言語のコンパイラというのは、次の4つのステップで成り立ちます。

(1)プリプロセッサ
(2)コンパイル
(3)アセンブル
(4)リンク

前回は「(1)プリプロセッサ」について記載しました。

次は「(2)コンパイル」について書いてみましょう。

コンパイルは、C言語を翻訳してアセンブリコードを出力します。

アセンブリコードはCPUによって異なります。このため、いろいろなCPUに対応したいろ

もっとみる
コンパイラが何をしているのか、ちょっとのぞいてみよう その1

コンパイラが何をしているのか、ちょっとのぞいてみよう その1

古い話で申し訳ないけれど、私がソフトウェア開発の仕事を始めた頃は、C言語レベルでデバッグできる環境はありませんでした。

そのため、いつもアセンブラでデバッグです。
お陰様で(?)、コンパイラが何をしているのかはよくわかりました。

コンパイラがなにをしているのか、気になったことはありませんか?
ちょっと覗いてみましょう。

昨今はとにかくすごい。
スマホでC言語がコンパイルできて、スマホで gd

もっとみる