質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

WSL(Windows Subsystem for Linux)

WSL (Windows Subsystem for Linux) は、Windows10のOS上でLinux向けのバイナリプログラムを実行可能にする機能です。また、WindowsOSのAPIを用いた仕組みを提供しており、Linux側からWindowsOSへのファイルアクセスもできます。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

2回答

1342閲覧

4バイトで比較するはずが5バイトで比較になっている

yukkuri

総合スコア624

Windows 10

Windows 10は、マイクロソフト社がリリースしたOSです。Modern UIを標準画面にした8.1から、10では再びデスクトップ主体に戻され、UIも変更されています。PCやスマホ、タブレットなど様々なデバイスに幅広く対応していることが特徴です。

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

WSL(Windows Subsystem for Linux)

WSL (Windows Subsystem for Linux) は、Windows10のOS上でLinux向けのバイナリプログラムを実行可能にする機能です。また、WindowsOSのAPIを用いた仕組みを提供しており、Linux側からWindowsOSへのファイルアクセスもできます。

GCC

GCCはGNU Compiler Collectionの略です。LinuxのC言語コンパイラのデファクトスタンダードであり、数多くの他言語やプラットフォームサポートもします。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2020/05/01 11:16

現在、ツールを作っていて、問題が発生しました。

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/sysmacros.h> #include <unistd.h> #include <fcntl.h> #include <linux/config.h> #include <linux/a.out.h> #define MINIX_HEADER 32 #define GCC_HEADER 1024 #define SYS_SIZE DEF_SYSSIZE #define DEFAULT_MAJOR_ROOT 0 #define DEFAULT_MINOR_ROOT 0 #define SETUP_SECTS 4 #define STRINGIFY(x) #x typedef union{ long l; short s[2]; char b[4]; }conv; long intel_long(long l) { conv t; t.b[0] = l & 0xff; l >>= 8; t.b[1] = l & 0xff; l >>= 8; t.b[2] = l & 0xff; l >>= 8; t.b[3] = l & 0xff; l >>= 8; return t.l; } short intel_short(short l) { conv t; t.b[0] = l & 0xff; l >>= 8; t.b[1] = l & 0xff; l >>= 8; return t.s[0]; } void die(char *str) { fprintf(stderr, "%s\n", str); exit(1); } void usage(void) { die("Usage: build bootsect setup system [rootdev] [> image]"); } int main(int argc, char **argv) { int i, id; char buf[1024]; char major_root, minor_root; struct stat sb; if((argc < 4) || (argc > 5)) usage(); if(argc > 4){ if(!strcmp(argv[4], "CURRENT")){ if(stat("/", &sb)){ perror("/"); die("Couldn't stat /"); } major_root = major(sb.st_dev); minor_root = minor(sb.st_dev); }else if(strcmp(argv[4], "FLOPPY")){ if(stat(argv[4], &sb)){ perror(argv[4]); die("Couldn't stat root device."); } major_root = major(sb.st_rdev); minor_root = minor(sb.st_rdev); }else major_root = minor_root = 0; }else{ major_root = DEFAULT_MAJOR_ROOT; minor_root = DEFAULT_MINOR_ROOT; } fprintf(stderr, "Root device is (%d, %d)\n", major_root, minor_root); for(i = 0; i < sizeof(buf); i++) buf[i] = 0; if((id = open(argv[1], O_RDONLY, 0)) < 0) die("Unable to open 'boot'"); if(read(id, buf, MINIX_HEADER) != MINIX_HEADER) die("Unable to read header of 'boot'"); fprintf(stderr, "[debug]:%lX\n", ((long *)buf)[0]); if(((long *)buf)[0] != intel_long(0x4100301)) die("Non-Minix header of 'boot'"); if(((long *)buf)[1] != intel_long(MINIX_HEADER)) die("Non-Minix header of 'boot'"); if(((long *)buf)[3] != 0) die("Illegal data segment in 'boot'"); if(((long *)buf)[4] != 0) die("Illegal bss in 'boot'"); if(((long *)buf)[5] != 0) die("Non-Minix header of 'boot'"); if(((long *)buf)[7] != 0) die("Illegal symbol table in 'boot'"); i = read(id, buf, sizeof(buf)); fprintf(stderr, "Boot sector %d bytes.\n", i); if(i != 512) die("Boot block must be exactly 512 bytes"); if((*(unsigned short *)(buf + 510)) != (unsigned short)intel_short(0xAA55)) die("Boot block hasn't got boot flag (0xAA55)"); buf[508] = (char)minor_root; buf[509] = (char)major_root; i = write(1, buf, 512); if(i != 512) die("Write call failed"); close(id); return 0; }

これで、a.outファイルを読み込むと、期待では
[debug]:4100301
と表示され、正常に終了するのですが、エラーで
[debug]:2004100301
と表示されてしまいます。
なぜ、該当の文で4100301と表示されないのでしょうか。
また、なぜlong型にキャストしているはずなのに
5バイト読み込まれているのでしょうか。

環境は、
Windows 10, Ubuntu 7.5.0 gcc 7.5.0

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

また、なぜlong型にキャストしているはずなのに5バイト読み込まれているのでしょうか。

勘違いです。
8バイトの表示なので16進で最大16文字ですが、上位ゼロは出力されませんので、1文字の場合もあります。

桁数指定しましょう。
%016lX

投稿2020/05/01 11:38

編集2020/05/01 11:40
otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukkuri

2020/05/01 11:43

そのようでした。 昔のプログラムなので、longキャストは32bitを確実にするためだったのかもしれません。 ありがとうございました。
guest

0

64bitだとlongは8bitでは?

投稿2020/05/01 11:20

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukkuri

2020/05/01 11:22

64bit環境なのですが、それではなぜ10桁(16進数なので40bit)表示されているのでしょうか?64bitでlongが8バイトであれば、16桁表示されると思っていたのですが。
ozwk

2020/05/01 11:31 編集

0が省略されてるだけでは? (0000002004100301)
yukkuri

2020/05/01 11:34

それがあったかと思い、フォーマットを変更しました %lX -> %0lX しかし、表示が変わりません...
退会済みユーザー

退会済みユーザー

2020/05/01 11:37

フォーマットも0パディングなしだしね
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問