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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1074閲覧

Pythonで16進数の演算を行うとエラーが出ます。文法を教えてください。

hogeee

総合スコア27

C

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/09/23 11:55

c

1#include <unistd.h> 2#include <sys/mman.h> 3#include <stdio.h> 4#include <stdlib.h> 5#include <err.h> 6 7#define BUFFER_SIZE 1000 8#define ALLOC_SIZE (1000 * 1024 * 1024) 9 10static char command[BUFFER_SIZE]; 11 12int main(void) 13{ 14 pid_t pid; 15 16 pid = getpid(); 17 snprintf(command, BUFFER_SIZE, "cat /proc/%d/maps", pid); 18 puts("*** memory map before memory allocation ***"); 19 20 fflush(stdout); 21 system(command); 22 23 void *new_memory; 24 new_memory = mmap(NULL, ALLOC_SIZE, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0); 25 if (new_memory == (void *) -1) 26 err(EXIT_FAILURE, "mmap() failed"); 27 28 puts(""); 29 printf("*** succeeded to allocate memory: address = %p; size = 0x%x ***\n", 30 new_memory, ALLOC_SIZE); 31 puts(""); 32 33 puts("*** memory map after memory allocation ***"); 34 fflush(stdout); 35 system(command); 36 37 if (munmap(new_memory, ALLOC_SIZE) == -1) 38 err(EXIT_FAILURE, "munmap() failed"); 39 exit(EXIT_SUCCESS); 40} 41

このコードはプロセスのメモリマップ情報を表示し、メモリを新たに100Mバイト確保し、再度メモリマップ情報を表示するプログラムです。
このコードを実行した結果が下です。

result

1*** memory map before memory allocation *** 2555ca8999000-555ca899a000 r--p 00000000 08:02 11805693 /home/sushi/c/linux_no_sikumi/mmap 3555ca899a000-555ca899b000 r-xp 00001000 08:02 11805693 /home/sushi/c/linux_no_sikumi/mmap 4555ca899b000-555ca899c000 r--p 00002000 08:02 11805693 /home/sushi/c/linux_no_sikumi/mmap 5555ca899c000-555ca899d000 r--p 00002000 08:02 11805693 /home/sushi/c/linux_no_sikumi/mmap 6555ca899d000-555ca899e000 rw-p 00003000 08:02 11805693 /home/sushi/c/linux_no_sikumi/mmap 7555ca9754000-555ca9775000 rw-p 00000000 00:00 0 [heap] 87f551138c000-7f55113b1000 r--p 00000000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 97f55113b1000-7f5511529000 r-xp 00025000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 107f5511529000-7f5511573000 r--p 0019d000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 117f5511573000-7f5511574000 ---p 001e7000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 127f5511574000-7f5511577000 r--p 001e7000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 137f5511577000-7f551157a000 rw-p 001ea000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 147f551157a000-7f5511580000 rw-p 00000000 00:00 0 157f5511594000-7f5511595000 r--p 00000000 08:02 4989309 /usr/lib/x86_64-linux-gnu/ld-2.31.so 167f5511595000-7f55115b8000 r-xp 00001000 08:02 4989309 /usr/lib/x86_64-linux-gnu/ld-2.31.so 177f55115b8000-7f55115c0000 r--p 00024000 08:02 4989309 /usr/lib/x86_64-linux-gnu/ld-2.31.so 187f55115c1000-7f55115c2000 r--p 0002c000 08:02 4989309 /usr/lib/x86_64-linux-gnu/ld-2.31.so 197f55115c2000-7f55115c3000 rw-p 0002d000 08:02 4989309 /usr/lib/x86_64-linux-gnu/ld-2.31.so 207f55115c3000-7f55115c4000 rw-p 00000000 00:00 0 217fff38e57000-7fff38e78000 rw-p 00000000 00:00 0 [stack] 227fff38edf000-7fff38ee2000 r--p 00000000 00:00 0 [vvar] 237fff38ee2000-7fff38ee3000 r-xp 00000000 00:00 0 [vdso] 24ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall] 25 26*** succeeded to allocate memory: address = 0x7f54d2b8c000; size = 0x3e800000 *** 27 28*** memory map after memory allocation *** 29555ca8999000-555ca899a000 r--p 00000000 08:02 11805693 /home/sushi/c/linux_no_sikumi/mmap 30555ca899a000-555ca899b000 r-xp 00001000 08:02 11805693 /home/sushi/c/linux_no_sikumi/mmap 31555ca899b000-555ca899c000 r--p 00002000 08:02 11805693 /home/sushi/c/linux_no_sikumi/mmap 32555ca899c000-555ca899d000 r--p 00002000 08:02 11805693 /home/sushi/c/linux_no_sikumi/mmap 33555ca899d000-555ca899e000 rw-p 00003000 08:02 11805693 /home/sushi/c/linux_no_sikumi/mmap 34555ca9754000-555ca9775000 rw-p 00000000 00:00 0 [heap] 357f54d2b8c000-7f551138c000 rw-p 00000000 00:00 0 367f551138c000-7f55113b1000 r--p 00000000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 377f55113b1000-7f5511529000 r-xp 00025000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 387f5511529000-7f5511573000 r--p 0019d000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 397f5511573000-7f5511574000 ---p 001e7000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 407f5511574000-7f5511577000 r--p 001e7000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 417f5511577000-7f551157a000 rw-p 001ea000 08:02 4989516 /usr/lib/x86_64-linux-gnu/libc-2.31.so 427f551157a000-7f5511580000 rw-p 00000000 00:00 0 437f5511594000-7f5511595000 r--p 00000000 08:02 4989309 /usr/lib/x86_64-linux-gnu/ld-2.31.so 447f5511595000-7f55115b8000 r-xp 00001000 08:02 4989309 /usr/lib/x86_64-linux-gnu/ld-2.31.so 457f55115b8000-7f55115c0000 r--p 00024000 08:02 4989309 /usr/lib/x86_64-linux-gnu/ld-2.31.so 467f55115c1000-7f55115c2000 r--p 0002c000 08:02 4989309 /usr/lib/x86_64-linux-gnu/ld-2.31.so 477f55115c2000-7f55115c3000 rw-p 0002d000 08:02 4989309 /usr/lib/x86_64-linux-gnu/ld-2.31.so 487f55115c3000-7f55115c4000 rw-p 00000000 00:00 0 497fff38e57000-7fff38e78000 rw-p 00000000 00:00 0 [stack] 507fff38edf000-7fff38ee2000 r--p 00000000 00:00 0 [vvar] 517fff38ee2000-7fff38ee3000 r-xp 00000000 00:00 0 [vdso] 52ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall] 53

この結果に乗っている
** succeeded to allocate memory: address = 0x7f54d2b8c000; size = 0x3e800000 **
から
7f54d2b8c000-7f551138c000
というアドレスが新しくmmap関数で取得したアドレスです。

その後領域サイズを確認しようとPythonで

python

1$ python -c "print(7f551138c000 - 7f54d2b8c000)"

を実行してみたのですが、下記のようにエラーが出ます。

result

1 File "<string>", line 1 2 print(7f551138c000 - 7f54d2b8c000) 3 ^ 4SyntaxError: invalid syntax

これは何がいけないのでしょうか?
書籍の通りタイプしたと思うのですが原因がわかりません。b
Pythonは全くわからないので、困っています。
よろしくお願いいたします。

環境
OS ubuntu 20.0
C言語コンパイラ gcc
Python 2.7.18rc1 (default, Apr 7 2020, 12:05:55)
[GCC 9.3.0] on linux2

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

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

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

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

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

guest

回答2

0

おそらく、結果も16進数表示したいと思いますので、以下で試してください。
python -c "print(hex(0x7f551138c000 - 0x7f54d2b8c000))"

投稿2020/09/23 12:01

toast-uz

総合スコア3266

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

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

hogeee

2020/09/23 12:07

ありがとうございました!ちゃんと16進数で表示されました!
guest

0

ベストアンサー

python -c "print(0x7f551138c000 - 0x7f54d2b8c000)"
ですね。Cと同じです。

投稿2020/09/23 11:59

otn

総合スコア84423

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

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

hogeee

2020/09/23 12:03

ちゃんと表示されました! 私はただの16進数の引き算だと思ったのですが、なぜ「0x」をつけないとだめなのでしょうか?
otn

2020/09/23 12:30 編集

普通のプログラミング言語では、数値表記のデフォルトは10進数です。
hogeee

2020/09/23 12:36

なるほど!いみがやっとわかりました。ありがとうございます。
thkana

2020/09/23 12:42

プログラムを書いた人が「16進数だと思った」かどうかなんてコンピュータは知りようがありません。 文法規則はちょっと棚上げしたとしても、0xをつけなかったとしたら、abc がなにかのシンボルなのかそれとも16進数のリテラルなのか、あるいは123が10進数なのか16進数なのか、どうやって区別できるでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問