!extend:checked:vvvvv:1000:512
(新スレ立ての際上記コマンドを2行書き込んでください)
C言語の話題のみ取り扱います C++の話題はC++スレへ
質問には最低限の情報(ソース/コンパイラ/OS)を付ける
数行で収まらないソースは以下を適当に使ってURLを晒す
https://paiza.io/
https://ideone.com/
http://codepad.org/
C11
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1570.pdf
C99
http://www.open-std.org/jtc1/sc22/WG14/www/docs/n1256.pdf
http://kikakurui.com/x3/X3010-2003-01.html
C FAQ 日本語訳
http://www.kouno.jp/home/c_faq/
JPCERT C コーディングスタンダード
https://www.jpcert.or.jp/sc-rules/
※前スレ
C言語なら俺に聞け 153
https://mevius.5ch.net/test/read.cgi/tech/1566050562/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
C言語なら俺に聞け 154
■ このスレッドは過去ログ倉庫に格納されています
1デフォルトの名無しさん (ワッチョイ bf63-lB9F)
2020/01/14(火) 19:32:30.16ID:SgRnb4BR0249デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/02(日) 13:56:18.00ID:gkoi3ncld 値を保持するだけなら何でも良いよ
保持出来るだけの精度が有れば
固定小数点だろうが整数部と小数部だろうが
10進浮動小数点だろうが
BCD整数だろうが
計算の方法、式、丸め方が特殊で
途中の型も特殊だったりする
これに多くの評価が必要
だから
結果の型だけを語るのはトンチンカン
保持出来るだけの精度が有れば
固定小数点だろうが整数部と小数部だろうが
10進浮動小数点だろうが
BCD整数だろうが
計算の方法、式、丸め方が特殊で
途中の型も特殊だったりする
これに多くの評価が必要
だから
結果の型だけを語るのはトンチンカン
250デフォルトの名無しさん (ワッチョイ 7d4f-unxX)
2020/02/02(日) 14:01:47.01ID:nz0OxFB30 >>246
一回計算する毎にいちいち2進に戻すのにそんな手間かけるより10進演算器用意する方が効率的ということ
一回計算する毎にいちいち2進に戻すのにそんな手間かけるより10進演算器用意する方が効率的ということ
251デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/02(日) 14:06:26.86ID:gkoi3ncld 手間とか効率とかの問題じゃなくて
値の一貫性の問題
最終的に得る値が整数だとしても
途中の計算精度や丸め方によって誤差が微妙に異なり
結果1円の誤差になりました
じゃダメなの
値の一貫性の問題
最終的に得る値が整数だとしても
途中の計算精度や丸め方によって誤差が微妙に異なり
結果1円の誤差になりました
じゃダメなの
252デフォルトの名無しさん (ブーイモ MM0a-Ftjm)
2020/02/02(日) 14:11:34.03ID:VB3p6sP1M >>238
あんたの言う誤差とは何かね?
あんたの言う誤差とは何かね?
253デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/02(日) 14:12:15.30ID:gkoi3ncld 途中の計算精度があれば良いってわけじゃない
100桁精度でも無限精度でもダメ
決まってるロジック通りの結果を返さなきゃダメ
数値計算と思わない方が良いかも
100桁精度でも無限精度でもダメ
決まってるロジック通りの結果を返さなきゃダメ
数値計算と思わない方が良いかも
254デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/02(日) 14:14:53.67ID:gkoi3ncld 決められてる通りのロジックで返した時の値との差が誤差
誤差は一切許されない
これがお金の計算
誤差は一切許されない
これがお金の計算
255デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/02(日) 14:17:09.96ID:gkoi3ncld オンラインゲームも一貫性が必要だったりする
対戦相手と結果が異なってはまずいので
そういう部分では
厳密にCPUでもGPUでも同じ値である必要かある
対戦相手と結果が異なってはまずいので
そういう部分では
厳密にCPUでもGPUでも同じ値である必要かある
256デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/02(日) 14:17:57.04ID:w7N5c9rM0 わかったぞ
十進数だと0.5円になるときには四捨五入すると1円になるけど
2進数の時0.4999999999円みたいになった時0円になっちゃうってこと?
十進数だと0.5円になるときには四捨五入すると1円になるけど
2進数の時0.4999999999円みたいになった時0円になっちゃうってこと?
257デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/02(日) 14:20:40.80ID:w7N5c9rM0 0.1円の誤差をなくすために0.1円以上掛けたら意味なくない?
258デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/02(日) 14:23:22.92ID:gkoi3ncld 1円でも誤差があると帰れない銀行員の話とか知らない?
259デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/02(日) 14:24:38.04ID:w7N5c9rM0 日本が異常なだけでしょ?
アメリカとかだと1円払って終わりじゃね?
アメリカとかだと1円払って終わりじゃね?
260デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/02(日) 14:30:28.56ID:gkoi3ncld 私が直接話を聞いたのは外資系の銀行員から
261デフォルトの名無しさん (ワッチョイ 7dda-unxX)
2020/02/02(日) 14:32:20.39ID:Wawdq7250 つまり
10進で計算するのは,10進で計算せよというロジックがあるからであって,循環小数を避けるためではない
ということか
そういうことなら誰も文句ないんじゃね?
10進で計算するのは,10進で計算せよというロジックがあるからであって,循環小数を避けるためではない
ということか
そういうことなら誰も文句ないんじゃね?
262デフォルトの名無しさん (ワッチョイ b501-0Ybi)
2020/02/02(日) 14:37:37.76ID:mzCY/+E00 https://ideone.com/HdUvEa
こういうことでは。
こういうことでは。
263デフォルトの名無しさん (ワッチョイ ea2c-KoMo)
2020/02/02(日) 14:44:42.42ID:ceem9FS20 >>256
0.5 は、2進数の1/2 だから、割り切れる。
0.25 は、2進数の1/4 だから、割り切れる
だから、0.5 + 0.25 = 0.75 も、2進数で割り切れる
でも、0.1 は循環小数になるから、
0.1 * 5 != 0.5
これは不一致!
情報処理の初級資格の内容w
これを勉強していない人は、プロじゃない!
つまり、お金の計算では、誤差のある浮動小数点演算は使えない!
Decimal を使う
0.5 は、2進数の1/2 だから、割り切れる。
0.25 は、2進数の1/4 だから、割り切れる
だから、0.5 + 0.25 = 0.75 も、2進数で割り切れる
でも、0.1 は循環小数になるから、
0.1 * 5 != 0.5
これは不一致!
情報処理の初級資格の内容w
これを勉強していない人は、プロじゃない!
つまり、お金の計算では、誤差のある浮動小数点演算は使えない!
Decimal を使う
264デフォルトの名無しさん (ワッチョイ b501-0Ybi)
2020/02/02(日) 14:48:07.68ID:mzCY/+E00 もういいわ。
おまえ等のプログラムじゃ金の計算できないわ。
エクセル使う。
おまえ等のプログラムじゃ金の計算できないわ。
エクセル使う。
265デフォルトの名無しさん (ワッチョイ 2a63-unxX)
2020/02/02(日) 14:48:39.82ID:lNG3EL+m0 三人で三等分して、構成比を%で表示しろと言われ、
何も考えずに計算結果出して見せたら、
合計が100%になってないと文句を言われたw
何も考えずに計算結果出して見せたら、
合計が100%になってないと文句を言われたw
266デフォルトの名無しさん (ワッチョイ b501-0Ybi)
2020/02/02(日) 15:07:37.05ID:mzCY/+E00 一番上のお姉ちゃんがプリン食べれないやつか。
>>250
>一回計算する毎にいちいち2進に戻すのにそんな手間かけるより10進演算器用意する方が効率的ということ
いいえ、値の保持と計算はずっと 2 進+固定小数点のままで行い、人間に値を見せるときにはじめて 2 進→ 10 進変換を実施します
>途中の計算精度や丸め方によって誤差が微妙に異なり
お金の計算における丸め方法の規則は、四捨五入にしても五捨五入にしても 10 進法整数に親和的なのだから、多桁長表現+固定小数点で表現すればかなり厳密に扱えるとおもいますよ
>一回計算する毎にいちいち2進に戻すのにそんな手間かけるより10進演算器用意する方が効率的ということ
いいえ、値の保持と計算はずっと 2 進+固定小数点のままで行い、人間に値を見せるときにはじめて 2 進→ 10 進変換を実施します
>途中の計算精度や丸め方によって誤差が微妙に異なり
お金の計算における丸め方法の規則は、四捨五入にしても五捨五入にしても 10 進法整数に親和的なのだから、多桁長表現+固定小数点で表現すればかなり厳密に扱えるとおもいますよ
>>263
>Decimal を使う
Decimal の内部表現方法に興味がありますね、まさか、今でも BCD だとは思えませんが(x86_AMD64 でも関連ニーモニックは消えました)、もしかして?!
>Decimal を使う
Decimal の内部表現方法に興味がありますね、まさか、今でも BCD だとは思えませんが(x86_AMD64 でも関連ニーモニックは消えました)、もしかして?!
269デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/02(日) 15:19:29.78ID:w7N5c9rM0 小数点の位置と整数の2つの情報で10進数の少数は誤差なくあらわせるよ
270デフォルトの名無しさん (ワッチョイ b501-0Ybi)
2020/02/02(日) 15:22:25.38ID:mzCY/+E00 >>269
どうやるんだよ。
どうやるんだよ。
271デフォルトの名無しさん (ワッチョイ 7d4f-unxX)
2020/02/02(日) 15:27:54.74ID:nz0OxFB30 >>267
丸めは計算ごとに適用されるんだよ、馬鹿。
丸めは計算ごとに適用されるんだよ、馬鹿。
272デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/02(日) 15:30:01.89ID:w7N5c9rM0 >>270
0.1は1番目に点がある1だから1と1で表せる
0.1は1番目に点がある1だから1と1で表せる
273デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/02(日) 15:36:23.54ID:w7N5c9rM0 少数点以下の整数と小数点以上の整数でも表せる
274デフォルトの名無しさん (ブーイモ MMc9-AfBq)
2020/02/02(日) 15:38:49.63ID:anvSpfnfM 機械語なら商と剰余はたいていいっぺんに計算できるけど、Cからそれらの機械語が使われると期待していい書き方ってどうすればいい?
10年来の疑問
10年来の疑問
275デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/02(日) 15:40:29.20ID:w7N5c9rM0 Cのライブラリーにいっぺんに計算されるやつがある
276デフォルトの名無しさん (ワッチョイ 2a63-unxX)
2020/02/02(日) 15:42:13.13ID:lNG3EL+m0 小数と少数を間違えないで
>>267
>>いいえ、値の保持と計算はずっと 2 進+固定小数点のままで行い、人間に値を見せるときにはじめて 2 進→ 10 進変換を実施します
>>271
>丸めは計算ごとに適用されるんだよ、馬鹿。
そうか、確かに私にも落ち度がありました、2進整数+固定小数点ならば、丸める桁まで 10 で割り続けて余りを求める必要がありますね、これはほとんど2進→10進変換といっていいですね
しかし、全桁を 2進→10進する必要はなく、丸める桁までで 2 進→ 10 進するだけでいい
x86-AMD64 では 8086 時代の BCD 補正命令は全部なくなってしまったことから考えても、「Decimal」型は整数+小数点位置なんじゃないかな…
>>いいえ、値の保持と計算はずっと 2 進+固定小数点のままで行い、人間に値を見せるときにはじめて 2 進→ 10 進変換を実施します
>>271
>丸めは計算ごとに適用されるんだよ、馬鹿。
そうか、確かに私にも落ち度がありました、2進整数+固定小数点ならば、丸める桁まで 10 で割り続けて余りを求める必要がありますね、これはほとんど2進→10進変換といっていいですね
しかし、全桁を 2進→10進する必要はなく、丸める桁までで 2 進→ 10 進するだけでいい
x86-AMD64 では 8086 時代の BCD 補正命令は全部なくなってしまったことから考えても、「Decimal」型は整数+小数点位置なんじゃないかな…
278デフォルトの名無しさん (ワッチョイ a612-i7CI)
2020/02/02(日) 16:00:27.23ID:SWo7Ruqh0279デフォルトの名無しさん (ブーイモ MMc9-AfBq)
2020/02/02(日) 16:24:08.92ID:VqF3mFhWM >>275
ポータブルなやつを頼む
ポータブルなやつを頼む
280デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/02(日) 16:27:09.95ID:w7N5c9rM0 >>279
標準ライブラリーだからポータブル
標準ライブラリーだからポータブル
281デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/02(日) 16:40:10.12ID:gkoi3ncld >>277
IEEE754にも10進数があるから見てみれば
IEEE754にも10進数があるから見てみれば
282デフォルトの名無しさん (ブーイモ MM0a-Ftjm)
2020/02/02(日) 16:50:09.63ID:VB3p6sP1M283デフォルトの名無しさん (ワッチョイ a612-i7CI)
2020/02/02(日) 17:00:29.36ID:SWo7Ruqh0284デフォルトの名無しさん (ワッチョイ 2a63-unxX)
2020/02/02(日) 17:03:20.75ID:lNG3EL+m0 円周率は概ね3です
285デフォルトの名無しさん (ブーイモ MM0a-Ftjm)
2020/02/02(日) 17:20:36.09ID:VB3p6sP1M >>283
あんたの言ってる誤差は循環小数云々の誤差ということでいいのか?
あんたの言ってる誤差は循環小数云々の誤差ということでいいのか?
286デフォルトの名無しさん (ワッチョイ 1163-6LpL)
2020/02/02(日) 17:52:51.69ID:8cBiUpXt0 盛り上がってるなー。
が、なんか思ったのと違う進行。。
が、なんか思ったのと違う進行。。
287デフォルトの名無しさん (ワッチョイ 2a63-unxX)
2020/02/02(日) 18:01:39.53ID:lNG3EL+m0288デフォルトの名無しさん (ワッチョイ 6aa5-OeZ9)
2020/02/02(日) 19:18:27.60ID:825maVGz0 >>219
そりゃーC言語よりも古いCOBOLがあるもん
銀行案件は全部そっち任せだろ
だからそういうライブラリを発達させる必要が無かった
COBOL最盛期がいつかは知らんがきっとIBM最高益の時代あたりだろ
そりゃーC言語よりも古いCOBOLがあるもん
銀行案件は全部そっち任せだろ
だからそういうライブラリを発達させる必要が無かった
COBOL最盛期がいつかは知らんがきっとIBM最高益の時代あたりだろ
289デフォルトの名無しさん (ワッチョイ 8a1e-7ddI)
2020/02/02(日) 20:44:43.11ID:F6yWVrL10 >>274
普通に書けば最適化してくれる場合もある。
とりあえず gcc -O2 とやってみた。
extern int w,x,y,z;
void foo( void) {
y = w / x;
z = w % x;
}
int bar( int x,int y){ return x / y + x % y;}
普通に書けば最適化してくれる場合もある。
とりあえず gcc -O2 とやってみた。
extern int w,x,y,z;
void foo( void) {
y = w / x;
z = w % x;
}
int bar( int x,int y){ return x / y + x % y;}
290デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/02(日) 20:51:51.61ID:gkoi3ncld 割り算は遅い
スーパーコンピュータでも遅い
定数の割り算で済む所は定数に
並列化可能ならSIMD命令で複数一気に
スーパーコンピュータでも遅い
定数の割り算で済む所は定数に
並列化可能ならSIMD命令で複数一気に
291デフォルトの名無しさん (ワッチョイ a612-i7CI)
2020/02/02(日) 20:55:57.98ID:SWo7Ruqh0 >>285
まあそういうことだ
おまえさんにとっての関心事に関係するかどうかは知らん
さっき言ったとおり、俺は保育士じゃないんで他人ん家の坊ちゃん嬢ちゃんは扱えない
プラレールだかリカちゃんだかの相手はしてられない
まあそういうことだ
おまえさんにとっての関心事に関係するかどうかは知らん
さっき言ったとおり、俺は保育士じゃないんで他人ん家の坊ちゃん嬢ちゃんは扱えない
プラレールだかリカちゃんだかの相手はしてられない
292デフォルトの名無しさん (ワッチョイ a612-i7CI)
2020/02/02(日) 20:57:05.76ID:SWo7Ruqh0293デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/02(日) 23:53:32.36ID:gkoi3ncld タンジェントもべき乗も遅いけど
使う頻度的には割り算より圧倒的に少ないし
見るからに遅そうだから気を付けるだろう
割り算や余りは手軽に使いがちで遅い
例えばSkylakeでは加減乗算の100倍くらいかかる
割り算と余り両方使うなら
以下のように書いた方が良い
c=a/b;
d=a-c*b;
除算命令を2回呼ぶことはなくなるし
bが定数なら乗算に置き換えてくれる
ライブラリだとbが定数でも除算命令を使ってしまうと思う
使う頻度的には割り算より圧倒的に少ないし
見るからに遅そうだから気を付けるだろう
割り算や余りは手軽に使いがちで遅い
例えばSkylakeでは加減乗算の100倍くらいかかる
割り算と余り両方使うなら
以下のように書いた方が良い
c=a/b;
d=a-c*b;
除算命令を2回呼ぶことはなくなるし
bが定数なら乗算に置き換えてくれる
ライブラリだとbが定数でも除算命令を使ってしまうと思う
294デフォルトの名無しさん (ワッチョイ ea79-/fp1)
2020/02/03(月) 07:43:30.26ID:0n0692Cx0 除算が遅いってのは常識だな
浮動小数点数演算の話だが2回以上同じ数で割るなら逆数を取っておいてそれを掛けろと習ったわ
そもそも浮動小数点数演算が圧倒的に遅いから可能な限り整数型で済ませろとも
浮動小数点数演算の話だが2回以上同じ数で割るなら逆数を取っておいてそれを掛けろと習ったわ
そもそも浮動小数点数演算が圧倒的に遅いから可能な限り整数型で済ませろとも
295デフォルトの名無しさん (アウアウクー MM7d-2G11)
2020/02/03(月) 08:16:49.22ID:vFO4eQ5PM どこでそんなこと習うんだ…
296デフォルトの名無しさん (ワッチョイ 89b3-x67y)
2020/02/03(月) 08:20:37.59ID:e9E2NTEb0 浮動小数点が圧倒的に遅いかどうかはCPU次第
PCなら速いし
CPUに命令がなければソフトウェア実装になるので遅い
この場合、当然floatよりdoubleの方が遅い
(floatもdoubleも32bitの環境もあるけど)
浮動小数点の割り算は
定数であれば1個でも逆数をかける方が良い
x / [定数] と x * (1.0/[定数])
で値が異なることがあるため、最適化してくれない場合がある
PCなら速いし
CPUに命令がなければソフトウェア実装になるので遅い
この場合、当然floatよりdoubleの方が遅い
(floatもdoubleも32bitの環境もあるけど)
浮動小数点の割り算は
定数であれば1個でも逆数をかける方が良い
x / [定数] と x * (1.0/[定数])
で値が異なることがあるため、最適化してくれない場合がある
297デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/03(月) 08:22:21.52ID:m5kUFkC70 割り算と余りを一回で計算できる命令がCPUにはあるのよ
298デフォルトの名無しさん (ワッチョイ 89b3-x67y)
2020/02/03(月) 08:27:41.12ID:e9E2NTEb0299デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/03(月) 08:36:20.54ID:m5kUFkC70 割り算が100倍掛かるって嘘じゃない?
調べたら掛け算より少し遅いくらいだけみたいだけど
調べたら掛け算より少し遅いくらいだけみたいだけど
300デフォルトの名無しさん (ブーイモ MMc9-BGKF)
2020/02/03(月) 09:47:15.11ID:x3IhE4UHM 浮動小数点の除算はニュートン法使うからそれほど遅くない。乗算の数倍程度。
整数の除算は基本的に高速化できないのでだいぶ遅い。
整数でも定数で除算すると逆数の乗算プラス補正で実装されるので速い。
アセンブリ出させて見てみるべし。
整数の除算は基本的に高速化できないのでだいぶ遅い。
整数でも定数で除算すると逆数の乗算プラス補正で実装されるので速い。
アセンブリ出させて見てみるべし。
301デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/03(月) 11:19:33.45ID:m5kUFkC70302デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/03(月) 12:43:23.75ID:jOrmfTQLd instlatx64でSkylakeの64bit命令の
スループットを見ると
IDIVはフルビットで95クロック
ADDは0.33, IMULは1クロック
AVX命令だと乗算や積和も0.5クロック
遅くて使われなくなったFSINが130クロックだから
遅さがわかると思う
コンパイラはなるべくこの命令を使わないで済むように
また使う回数をなるべく減らすよう工夫するんだけど
標準ライブラリの場合はIDIVを無条件で使ってしまう
スループットを見ると
IDIVはフルビットで95クロック
ADDは0.33, IMULは1クロック
AVX命令だと乗算や積和も0.5クロック
遅くて使われなくなったFSINが130クロックだから
遅さがわかると思う
コンパイラはなるべくこの命令を使わないで済むように
また使う回数をなるべく減らすよう工夫するんだけど
標準ライブラリの場合はIDIVを無条件で使ってしまう
303デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/03(月) 12:49:05.54ID:jOrmfTQLd 浮動小数点だと差はちょっと縮まる
加減乗算と積和は0.5クロック
除算は倍精度スカラーで4クロック、ベクタで8クロック
倍精度浮動小数点の積和演算が4個同時に出来る命令が
毎クロック2個ずつ実行出来るのに
ただの整数除算1個が95クロックもかかる
遅さがわかるでしょ?
加減乗算と積和は0.5クロック
除算は倍精度スカラーで4クロック、ベクタで8クロック
倍精度浮動小数点の積和演算が4個同時に出来る命令が
毎クロック2個ずつ実行出来るのに
ただの整数除算1個が95クロックもかかる
遅さがわかるでしょ?
304デフォルトの名無しさん (ワッチョイ 39d2-fhCF)
2020/02/03(月) 12:52:56.44ID:m5kUFkC70 100倍掛かるなら100倍時間掛かるはずでしょ
そんなわけ無いじゃん
そんなわけ無いじゃん
305デフォルトの名無しさん (アウウィフ FF21-0Ybi)
2020/02/03(月) 13:50:54.22ID:62FLJlSTF パイプラインですね判りますω
306デフォルトの名無しさん (ワッチョイ a612-i7CI)
2020/02/03(月) 15:12:48.45ID:TXSv3nXz0 除算器をパイプライン化することで
スループットは上げられても
レイテンシは変わらないかんな
スループットは上げられても
レイテンシは変わらないかんな
307デフォルトの名無しさん (ワッチョイ 2a63-unxX)
2020/02/03(月) 15:14:45.18ID:XXjF7BB80 予測で
308デフォルトの名無しさん (ワッチョイ 5d35-MzNC)
2020/02/04(火) 01:59:00.38ID:SgzhJHen0 今どき役に立つ場面は少ないけどこういうの楽しいな
309デフォルトの名無しさん (ワッチョイ 7d01-0Ybi)
2020/02/04(火) 06:57:32.95ID:j6eziqdx0 以下のプログラムのb_testにはなぜ0x3322ではなく、0x4433が代入されるのでしょうか?
#include <stdio.h>
typedef struct
{
unsigned char a;
unsigned short b;
} TEST_2;
int main(void)
{
unsigned char bytes[] = { 0x11, 0x22, 0x33, 0x44 };
TEST_2* pMemoryDevice = (TEST_2*)bytes;
unsigned char a_test = pMemoryDevice->a;
unsigned short b_test = pMemoryDevice->b;
printf("0x%X\n", b_test);
return 0;
}
#include <stdio.h>
typedef struct
{
unsigned char a;
unsigned short b;
} TEST_2;
int main(void)
{
unsigned char bytes[] = { 0x11, 0x22, 0x33, 0x44 };
TEST_2* pMemoryDevice = (TEST_2*)bytes;
unsigned char a_test = pMemoryDevice->a;
unsigned short b_test = pMemoryDevice->b;
printf("0x%X\n", b_test);
return 0;
}
310デフォルトの名無しさん (ワッチョイ 151a-unxX)
2020/02/04(火) 07:04:32.35ID:/MaewKoE0 >>309
aliasing rule 違反やアライメント違反の可能性などにより未定義動作なので 0x4433 になるとも限りません。
対象の環境を限定して何が起こっているか知りたいならアセンブリを出力してみるのがいいと思います。
aliasing rule 違反やアライメント違反の可能性などにより未定義動作なので 0x4433 になるとも限りません。
対象の環境を限定して何が起こっているか知りたいならアセンブリを出力してみるのがいいと思います。
311デフォルトの名無しさん (ワッチョイ 7d01-0Ybi)
2020/02/04(火) 07:14:24.84ID:j6eziqdx0 >>310
アセンブリ出力してみてみたんですが、そもそもなぜそのようになるのかが疑問です。
この場合、"0x11"がBYTE, "0x22, 0x33"がWORDのバイト配列を構造体で表したい場合どうすればいいのでしょうか?
アセンブリ出力してみてみたんですが、そもそもなぜそのようになるのかが疑問です。
この場合、"0x11"がBYTE, "0x22, 0x33"がWORDのバイト配列を構造体で表したい場合どうすればいいのでしょうか?
312デフォルトの名無しさん (ワッチョイ 89b3-x67y)
2020/02/04(火) 07:36:55.76ID:CGekWIL20 bは2バイトだから2バイト境界になるように詰め物をした
コンパイラやCPUの仕様
コンパイラやCPUの仕様
313デフォルトの名無しさん (ワッチョイ 89b3-x67y)
2020/02/04(火) 07:38:21.05ID:CGekWIL20 環境依存
#pragma pack とかコンパイルオプションで
変えられたりする
#pragma pack とかコンパイルオプションで
変えられたりする
314デフォルトの名無しさん (ワッチョイ e5f9-/fp1)
2020/02/04(火) 07:49:06.50ID:QC3PzamG0315デフォルトの名無しさん (ワッチョイ 7d01-0Ybi)
2020/02/04(火) 08:03:48.58ID:j6eziqdx0 #pragma pack(1)を使うことによって解決しました!
ありがとうございます。
今まで結構バイト配列を構造体に割り当てるってことをしてきましたが、気づきませんでした、、
ありがとうございます。
今まで結構バイト配列を構造体に割り当てるってことをしてきましたが、気づきませんでした、、
316デフォルトの名無しさん (ブーイモ MMc9-BGKF)
2020/02/04(火) 09:27:02.59ID:rp8heKByM できるかできないかアーキテクチャ環境依存だし、
できても遅くなる可能性もあるので注意
できても遅くなる可能性もあるので注意
317デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/04(火) 12:50:10.02ID:GNpMFwh2d そもそもunsigned charの配列をキャストしてる時点で
318デフォルトの名無しさん (ワッチョイ a612-i7CI)
2020/02/04(火) 13:04:48.75ID:6srsz/DQ0 unsigned charの配列をキャストしてる時点で何?
309は構造体の性質を調べる実験をしていて
そのために普段しないことをわざとやってるんだが
309は構造体の性質を調べる実験をしていて
そのために普段しないことをわざとやってるんだが
319デフォルトの名無しさん (アウアウウー Sa21-lBRq)
2020/02/04(火) 15:53:52.78ID:MHG3R7Tga ネットワークやファイルから読んだバイナリの塊を構造体に当て嵌めて解析を楽にするなんてことは、よくやる。
まあ、本当だったらバイナリから読んで構造体側にコピーするような関数を作った方が良いんだろうけどね。(またはPerlのunpackみたいなやつ)。
まあ、本当だったらバイナリから読んで構造体側にコピーするような関数を作った方が良いんだろうけどね。(またはPerlのunpackみたいなやつ)。
320デフォルトの名無しさん (アウアウウー Sa21-lBRq)
2020/02/04(火) 16:00:02.30ID:MHG3R7Tga そういえばsscanf()と似たような感じでバイナリとフォーマットと可変引数で代入先ポインタ並べて渡すとバイナリ側から読んで値入れてくれるようなPerlのunpack風な関数も作ろうと思えば作れるね。
321デフォルトの名無しさん (ワッチョイ b67c-unxX)
2020/02/04(火) 19:11:16.20ID:b7qwiVAD0322デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/04(火) 19:18:36.03ID:rvpdgwbCd コンパイラ依存や環境依存はビックフィールドだけじゃない
323デフォルトの名無しさん (スッップ Sd0a-x67y)
2020/02/04(火) 19:18:58.04ID:rvpdgwbCd ビットフィールド
324デフォルトの名無しさん (ワッチョイ 6aa5-OeZ9)
2020/02/04(火) 20:24:28.00ID:TWTPcweW0 あの大事件の裏にはこういうミスが隠されているのか……
325デフォルトの名無しさん (ワッチョイ 89b3-x67y)
2020/02/04(火) 20:31:06.36ID:CGekWIL20 コロン抜け?
326デフォルトの名無しさん (ワッチョイ 2a63-unxX)
2020/02/04(火) 21:26:03.56ID:lLuVC2X20 あれはFortranだろ
327デフォルトの名無しさん (アークセー Sxbd-nHCh)
2020/02/04(火) 22:02:12.09ID:xaJSTMSvx 僕のはリトルエンディアン
328デフォルトの名無しさん (ワッチョイ ea2c-KoMo)
2020/02/04(火) 23:14:03.74ID:6/2RTZHA0 漏れが、新幹線のチケット開発してた時には、ビットフィールドなどは使わなかった
全てのバイト内で、データの位置を決めて、ビット演算でやっていた
全てのバイト内で、データの位置を決めて、ビット演算でやっていた
329デフォルトの名無しさん (ササクッテロラ Sp0b-R1hy)
2020/02/05(水) 01:10:02.17ID:N1gPUNHxp 309のb_testの数値ってなぜ0x3344じゃないの?
それすらわからん
ここのスレレベル高いな
それすらわからん
ここのスレレベル高いな
330デフォルトの名無しさん (ワッチョイ 9f63-56gX)
2020/02/05(水) 01:21:18.13ID:wXMktV7+0 >>329
実行環境にもよると思います
実行環境にもよると思います
331デフォルトの名無しさん (ワッチョイ 9f63-56gX)
2020/02/05(水) 01:26:09.05ID:wXMktV7+0332デフォルトの名無しさん (アウウィフ FF9b-VM48)
2020/02/05(水) 19:45:58.28ID:2rKdW1EcF >>317 みたいなのも居る訳で
333デフォルトの名無しさん (スップ Sd3f-pfqa)
2020/02/05(水) 20:13:44.79ID:PZ/5vknBd >>317で何を言おうとしたかわからなかったか
334デフォルトの名無しさん (スップ Sd3f-pfqa)
2020/02/05(水) 20:18:11.07ID:PZ/5vknBd キャストしてる時点でアラインメントは
335デフォルトの名無しさん (ワッチョイ d735-oJhu)
2020/02/05(水) 23:49:56.70ID:V2ceD5vC0 どんだけかまって欲しいの。
336デフォルトの名無しさん (ワッチョイ 9f76-3u8R)
2020/02/06(木) 06:52:45.18ID:VEO7DUBt0 机上でガタガタ言うだけで満足するやつもいれば
実際に境界違反すると何が起きるのか自分の目で目撃したいやつもいるのさ
俺は後者に共感する
実際に境界違反すると何が起きるのか自分の目で目撃したいやつもいるのさ
俺は後者に共感する
337デフォルトの名無しさん (ワッチョイ b7b3-pfqa)
2020/02/06(木) 07:27:32.13ID:/W9iMVJD0 問題なくアクセス可能
例外発生
ズレてアクセス
性能以外の振舞いこのくらいは経験がある
他にあるかな?
ズレてアクセスされるCPUは
問題が分かりにくく厄介
例外発生
ズレてアクセス
性能以外の振舞いこのくらいは経験がある
他にあるかな?
ズレてアクセスされるCPUは
問題が分かりにくく厄介
338デフォルトの名無しさん (ワッチョイ b7b3-pfqa)
2020/02/06(木) 07:35:58.42ID:/W9iMVJD0 机上も重要
CPUのデータシートやコンパイラの説明書は当然見ないと
ズレてるスタックポインタをずらしたまま使う意味とかわからんでしょ
CPUのデータシートやコンパイラの説明書は当然見ないと
ズレてるスタックポインタをずらしたまま使う意味とかわからんでしょ
339デフォルトの名無しさん (ワッチョイ 9f76-3u8R)
2020/02/06(木) 08:03:27.48ID:VEO7DUBt0 机上がいらんとは言ってねえよ
何のための机上か考えろということだ
何のための机上か考えろということだ
340デフォルトの名無しさん (スップ Sd3f-4cqo)
2020/02/06(木) 08:08:22.76ID:h/xvakBVd ビットフィールドって環境依存なのか
分かりやすくて良いのに…
分かりやすくて良いのに…
341デフォルトの名無しさん (ワッチョイ b7b3-pfqa)
2020/02/06(木) 14:31:03.01ID:/W9iMVJD0 構造体自体環境依存
342デフォルトの名無しさん (ワッチョイ d735-oJhu)
2020/02/06(木) 19:36:45.30ID:OKCzzxK90 >>334
アライメントは何?
アライメントは何?
343デフォルトの名無しさん (ブーイモ MM1b-2t1T)
2020/02/06(木) 21:11:00.88ID:yuUE1QQrM 定義しただけじゃ構造体のアライメントを算出してくれないコンパイラがあるんだなー
union { ;static{ al,ah;ググってて遭遇ちょっと新鮮な驚き
実体を作らず、ポインタキャストでのみ利用してっとグチャゲチャなアドレスを引っ張ってくるみたいな
union { ;static{ al,ah;ググってて遭遇ちょっと新鮮な驚き
実体を作らず、ポインタキャストでのみ利用してっとグチャゲチャなアドレスを引っ張ってくるみたいな
344デフォルトの名無しさん (ラクッペ MMcb-oJhu)
2020/02/07(金) 17:54:26.07ID:flffdOy2M AAと出力されて欲しいのですがなぜ4バイトになるのでしょうか
https://ideone.com/0v6mPr
https://ideone.com/0v6mPr
345デフォルトの名無しさん (ブーイモ MM1b-CFeS)
2020/02/07(金) 18:46:29.60ID:ZbQSjjsiM charを引数として渡すとintに格上げされる。
charがこの環境ではsigned charらしいので、0xAAはマイナス扱いされる。
intに格上げするときに符号拡張されて上位24ビットが1で埋められる。
charがこの環境ではsigned charらしいので、0xAAはマイナス扱いされる。
intに格上げするときに符号拡張されて上位24ビットが1で埋められる。
346デフォルトの名無しさん (ラクッペ MMcb-oJhu)
2020/02/07(金) 19:07:15.66ID:OIss2gZ6M347デフォルトの名無しさん (ワッチョイ 9f63-56gX)
2020/02/07(金) 19:12:45.37ID:2Fs88HW00 こうする、とか
printf("%0X\n", *(unsigned char*)u);
printf("%0X\n", (unsigned char)u[0]);
printf("%0X\n", *(unsigned char*)u);
printf("%0X\n", (unsigned char)u[0]);
348デフォルトの名無しさん (ワッチョイ d735-oJhu)
2020/02/07(金) 19:54:01.80ID:loJf6Qnv0 なんもわかってなくて草
349デフォルトの名無しさん (ワッチョイ 571d-uqPE)
2020/02/07(金) 22:52:47.29ID:GxNDg+Fe0 実務経験1年で月収80万稼げるエンジニアになった理由
https://www.youtube.com/watch?v=DrbbyGsHQic
意識が低いエンジニアこそフリーランスになれ
https://www.youtube.com/watch?v=nSEaAJlgjbQ
フリーランスエンジニアの週3労働ってどんな感じ?
https://www.youtube.com/watch?v=8yjoDCdbzMc
ぼくがスキルのない社畜ならこうやって脱する
https://www.youtube.com/watch?v=aae8xxbUlMM
初めて人を雇ったらもう二度とサラリーマンをやりたくないと思った話
https://www.youtube.com/watch?v=U0OCGRVLFsM
プログラミングは文系でも余裕で出来ます!理由を現役プログラマーが解説
https://www.youtube.com/watch?v=iBOeiSKBIW8
貧乏人こそ社会不適合者
https://www.youtube.com/watch?v=O3BT72BIBJI
元ド貧乏が教える】貧乏を抜け出すための2つの考え方
https://www.youtube.com/watch?v=IRrCgTy3ckc
より良いオファー貰ってるのに転職しないとか何考えてるの?
https://www.youtube.com/watch?v=i0J6uRhlj7o
https://www.youtube.com/watch?v=DrbbyGsHQic
意識が低いエンジニアこそフリーランスになれ
https://www.youtube.com/watch?v=nSEaAJlgjbQ
フリーランスエンジニアの週3労働ってどんな感じ?
https://www.youtube.com/watch?v=8yjoDCdbzMc
ぼくがスキルのない社畜ならこうやって脱する
https://www.youtube.com/watch?v=aae8xxbUlMM
初めて人を雇ったらもう二度とサラリーマンをやりたくないと思った話
https://www.youtube.com/watch?v=U0OCGRVLFsM
プログラミングは文系でも余裕で出来ます!理由を現役プログラマーが解説
https://www.youtube.com/watch?v=iBOeiSKBIW8
貧乏人こそ社会不適合者
https://www.youtube.com/watch?v=O3BT72BIBJI
元ド貧乏が教える】貧乏を抜け出すための2つの考え方
https://www.youtube.com/watch?v=IRrCgTy3ckc
より良いオファー貰ってるのに転職しないとか何考えてるの?
https://www.youtube.com/watch?v=i0J6uRhlj7o
■ このスレッドは過去ログ倉庫に格納されています
