말이 두서없이 쓰였지만.. 아래의 링크와 위의 말들을 종합해서 이해하는 데에 도움이 되었으면 한다.
그리고 덕분에 size_t가 loop에 의해 메모리나 문자열의 길이를 구한다는 사실을 알게되었다.
또한 unsigned long은 사실 %lu라는 형식 지정자가 있으나, 본 실습의 목적은 sizeof()에 의해 size_t로 출력하는 것이므로 %zu가 권장되는 형식지정자이다. 이 부분 역시 호환성으로 인해 %zu가 권장되는거다!
결국 컴퓨터를 배울때마다 항상 중요시되는 호환성! 편의성! 요놈들이 진짜 중요한거다
요놈들에 대해서도 왜? 호환성이 야무져? 이게 왜 편해? 라는데 진짜 그리고 파도파도 이해가 안되면... 앨런 튜링센세를 뵙고오던..C contributer를 뵙고오던...그냥 받아들이던지.. 하는게 답인거 같다ㅠ
====================
이하의 내용은 간단한 실습들입니다.
overflow 재현
code
#include <stdio.h>
#include <limits.h>
int main(){
char value = CHAR_MAX;
printf("Original value: %d\n", value);
value = value+1;
printf("Value after adding 1: %d\n", value);
return 0;
}
result
그렇다면 underflow로 해보자!
code
#include <stdio.h>
#include <limits.h>
int main(){
char value = CHAR_MIN;
printf("Original value: %d\n", value);
value = value-1;
printf("Value after subtracting 1: %d\n", value);
return 0;
}
result
====================
cf.
gcc -o main main.c -g //디버깅 심볼 포함
일반적으로는 분석의 방해를 위하여 디버깅 심볼을 포함시키지 않는다.
디버깅 심볼을 날릴 시, IDA등의 decompiler로 보기에 난해하다..!!!
(gdb) b main //중단점 설정
(gdb) r //함수를 만날 경우 내불로 들어가지 않고 실행됨
(gdb) n //다음 줄 실행
(gdb) p value // p[변수명] 변수값 출력
(gdb) p/t value // p/[출력형식][변수명]: 출력형식에 맞추어 변수값 출력
==================
특정 위치의 비트를 끄는 c언어 프로그램 작성후 확인 실습
1. 특정 비트만큼 1을 시프트한다 (1 << position)
2. 모든 비를 NOT을 활용하여 반전 시킨다.
3. AND연산을 수행함으로써 특정 비트를 끌 수 있다.
Answer
#include <stdio.h>
int is_bit_set(unsigned char value, int position) {
return (value&(1 << position)) != 0;
}
unsigned char set_bit(unsigned char value, int position) {
return value | ( 1 << position);
}
unsigned char clear_bit(unsigned char value, int position) {
return value & ~( 1 << position);
}
int main() {
unsigned char value = 0b00001000;
if(is_bit_set(value, 3)) {
printf("3rd bit is set!\n");
}
else {
printf("3rd bit is not set!\n");
}
value = set_bit(value, 2);
printf("Value after setting 2nd bit: %d\n", value);
value = clear_bit(value, 2);
printf("Value after setting 2nd bit: %d\n", value);
return 0;
}
사용자가 position을 입력받도록 하는 code
#include <stdio.h>
int is_bit_set(unsigned char value, int position) {
return (value&(1 << position)) != 0;
}
unsigned char set_bit(unsigned char value, int position) {
return value | ( 1 << position);
}
unsigned char clear_bit(unsigned char value, int position) {
return value & ~( 1 << position);
}
int main() {
unsigned char value = 0b00001000;
int position = 0;
if(is_bit_set(value, 3)) {
printf("3rd bit is set!\n");
}
else {
printf("3rd bit is not set!\n");
}
printf("input the position: ");
scanf("%d", &position);
value = set_bit(value, position);
printf("Value after setting 2nd bit: %d\n", value);
value = clear_bit(value, position);
printf("Value after setting 2nd bit: %d\n", value);
return 0;
}