불행히도 C/C++ 내장형 타입 중에는 8byte를 초과하는 자료형이 존재하지 않습니다. stackoverflow를 찾아보니 직접 구현을 해서 사용하거나 외부 라이브러리(Gmplib, bigint)를 사용하라고 하는데.. 입맛에 맞게 사용하기 위해 boost::multiprecision을 활용하여 간략하게 구현해보았습니다.
intmain() { std::string left = "18446744073709551615"; std::string right = "18446744073709551615"; // 18446744073709551615는 10진수로 표현된 20자리 정수 값이며 풀어써보면 (1*10^19) + (8*10^18) + (4*10^17) + ... + (1*10^1) + (5*10^0) 입니다. // 해당 과정을 구현한 코드는 아래와 같습니다. // // 사실 10진수 정수의 경우에는 문자열 타입의 값을 boost::multiprecision::cpp_int 생성자의 인자로 전달하면 쉽게 변환하여 연산이 가능합니다. // std::string value = "18446744073709551615"; // boost::multiprecision::cpp_int bi_value(value); // // 하지만 Java의 BigInteger 처럼 사용자가 직접 특정 진수를 지정하여 변환할 수는 없었기때문에 진수 변환 로직을 추가했습니다. boost::multiprecision::cpp_int bi_left(0); int len = left.length(); for (int i = 0; i < len; ++i) { std::string tmp_str; tmp_str.append(1, left[i]); bi_left += (boost::multiprecision::pow(boost::multiprecision::cpp_int(10), len - i - 1) * std::strtoimax(tmp_str.c_str(), nullptr, 10)); }
boost::multiprecision::cpp_int bi_right(0); len = right.length(); for (int i = 0; i < len; ++i) { std::string tmp_str; tmp_str.append(1, left[i]); bi_right += (boost::multiprecision::pow(boost::multiprecision::cpp_int(10), len - i - 1) * std::strtoimax(tmp_str.c_str(), nullptr, 10)); }
오늘은 공룡책🦕에 언급된 Blocking과 Nonblocking, Synchronous와 Asynchronous에 대해서 정리해보고자 합니다. Synchronous와 Asynchronous의 개념은 쓰레드와 I/O에서 등장하게 되는데요, 각각이 어떠한 의미로 사용되는지도 구분해서 살펴보도록 하겠습니다.
이번 포스팅에서는 인텔 Hyperscan의 공식 문서를 통해 컴파일(compile)이나 스캔(scan)과 같은 Hyperscan의 기본적인 개념들에 대해 알아보도록 하겠습니다. 추후에는 Hyperscan API를 직접 사용하여 정규 표현식 패턴 매칭을 수행하는 샘플 코드도 업로드할 예정입니다.
이번 포스팅에서는 The Art of Debugging with GDB, DDD and Eclipse의 Chatper 4 WHEN A PROGRAM CRASHES 내용을 번역해보았습니다. 해당 챕터의 앞부분에서는 가상 주소 공간에서의 페이지(page)에 대한 개념을 소개하고 seg fault가 발생하는 원인을 페이지(page)와 연관지어 잘 설명해주고 있습니다.