C言語,2の補数表現について、実際に計算して確認するプログラム

スポンサーリンク

鍛錬 347

C言語,2の補数表現について、実際に計算して確認するプログラム

2の補数表現について、実際に計算して確認するプログラムを作成しました。

スポンサーリンク

プログラム(アセンブリ確認用)

2の補数で表現するには、数値のビットを反転させた後に 1 を加算します。

以下は、数値 1 のビットを反転させた後に 1 を加算するプログラム、sample.c です。

// include
#include <stdio.h>

// main
int main(void)
{
	int dec;
	char bfr;
	char aft;
	
	dec = 1;
	
	// 1 を格納
	bfr = dec;
	
	// 1 のビットを反転させた後, 1 を加算して格納
	aft = ~dec + 1;
	
	return 0;
}
スポンサーリンク

実行結果(アセンブリ出力)

以下は、上記のプログラム sample.c をアセンブリ出力しています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -S sample.c
***@ubuntu:~/***/test/c$ cat sample.s
	.file	"sample.c"
	.text
	.globl	main
	.type	main, @function
main:
.LFB0:
	.cfi_startproc
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset 6, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register 6
	movl	$1, -4(%rbp)
	movl	-4(%rbp), %eax
	movb	%al, -6(%rbp)
	movl	-4(%rbp), %eax
	negl	%eax
	movb	%al, -5(%rbp)
	movl	$0, %eax
	popq	%rbp
	.cfi_def_cfa 7, 8
	ret
	.cfi_endproc
.LFE0:
	.size	main, .-main
	.ident	"GCC: (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0"
	.section	.note.GNU-stack,"",@progbits

 
上記に示した通り、数値のビットを反転させて 1 を加算する処理が、コンパイラによって negl 命令にて2の補数を計算するように記述されています。

スポンサーリンク

プログラム(実際に計算して確認)

以下は、数値のビットを2の補数表現で変換し、符号を反転させるプログラム、two_complement.c です。

// include
#include <stdio.h>
#include <stdlib.h>

// main
int main(int argc, char *argv[])
{
	int dec;
	char bfr;
	char aft;
	
	// コマンドライン引数を格納
	if (argc > 1)
		dec = atoi(argv[1]);
	else
		dec = 0;
	
	// 数値を格納
	bfr = dec;
	
	// 数値のビット反転後, 1 を加算して格納
	aft = ~dec + 1;
	
	printf("before = %d\n", bfr);
	printf("after  = %d\n", aft);
	
	return 0;
}
スポンサーリンク

実行結果

以下は、プログラム two_complement.c を実行して、数値のビットを2の補数表現で変換し、符号を反転させています。

***@ubuntu:~/***/test/c$ 
***@ubuntu:~/***/test/c$ gcc -Wall -Wextra two_complement.c -o two_complement
***@ubuntu:~/***/test/c$ ./two_complement 1
before = 1
after  = -1
***@ubuntu:~/***/test/c$ ./two_complement 123
before = 123
after  = -123
***@ubuntu:~/***/test/c$ ./two_complement -1
before = -1
after  = 1
***@ubuntu:~/***/test/c$ ./two_complement -123
before = -123
after  = 123

 
上記に示した通り、符号を反転させることができました。

タイトルとURLをコピーしました