diff options
-rw-r--r-- | 7_1/Makefile | 29 | ||||
-rw-r--r-- | 7_1/main.c | 46 | ||||
-rw-r--r-- | README.md | 2 |
3 files changed, 76 insertions, 1 deletions
diff --git a/7_1/Makefile b/7_1/Makefile new file mode 100644 index 0000000..80b3f39 --- /dev/null +++ b/7_1/Makefile @@ -0,0 +1,29 @@ + +all: test + +.PHONY: test clean + +test: task7_1 + ./$< 69 + ./$< 429 + ./$< 828 + ./$< 425729 + ./$< 235723572579 + ./$< 000111222333 + ./$< 1048575 + ./$< 1048576 + ./$< -31273891273891273 + ./$< -000000000000000000 + ./$< -2313423 + ./$< -123 + - ./$< -9223372036854775809 + ./$< -9223372036854775807 + - ./$< -9223372036854775808 + ./$< -1048576 + ./$< -1048575 + + +task7_1: main.c + cc -o task7_1 main.c + + diff --git a/7_1/main.c b/7_1/main.c new file mode 100644 index 0000000..ef4536b --- /dev/null +++ b/7_1/main.c @@ -0,0 +1,46 @@ +#include<stdlib.h> +#include<stdio.h> + +/* бля какой же код охуенный */ +/* ломается, если x = 0x8000000000000000 */ +char* tobin(long int x) { + size_t i = 0, j = 0; + char buffer[64]; + char *ret; + char sgn = x < 0; + + x *= ((x > 0) << 1) - 1; + printf("%li\n", x); + for (; x; x >>= 1) buffer[i++] = '0' + (x & 1); + ret = calloc(i + 1 + sgn, sizeof *ret); + ret[0] = '-'; + j += sgn; + while (i) ret[j++] = buffer[--i]; + + return ret; +} + +int main(int argc, char* argv[]) { + long number; + char *bin; + + if (argc != 2) { + fprintf(stderr, "\x1b[91mError: Invalid amount of arguments\x1b[0m\n" + "Usage: \x1b[92m%s <number>\n\x1b[0m", argv[0]); + return 1; + } + + number = atol(argv[1]); + if (number == 0) { + puts("Binary for 0: 0"); + return 0; + } + if (number == 0x8000000000000000) { + puts("Aha, I see what you did there)"); + return 1; + } + bin = tobin(number); + printf("Binary for %li: %s\n", number, bin); + free(bin); + return 0; +} @@ -1,7 +1,7 @@ # Задания 7.1 и 7.2 ## 7.1: -пока не сделал +`make test` протестирует программу с кучей кейсов ## 7.2: ### Запуск |