이 때 초기화 할 값인 c는 인자로는 int로 전달되지만 함수 내부적으로는 unsigned char로 형변환 되어서 사용된다.
메모리에 접근할 때에는 signed char형이 아닌 unsigned char형을 사용해야하는 이유
unsigned char 는 모든 bit를 투명하게 볼 수 있는 특성을 제공합니다. 즉, 다른 type 은 내부 비트의 일부를 값을 표현하기 위한 용도가 아닌 다른 용도(부호 비트)로 사용할 수 있으나 unsigned char 는 이것이 허락되지 않습니다.
따라서, 임의의 메모리에 바이트 단위로 접근해 값을 다룰 때에는 반드시 unsigned char 를 사용해야 full portability 를 얻을 수 있는 것입니다. 또한, 그와 같은 이유로 signed char 가 표현할 수 있는 값의 개수보다 unsigned char 가 표현할 수 있는 값의 개수가 많다는 사실에도 유의할 필요가 있습니다. signed char <-> unsigned char 사이의 값 변환이 1:1 로 이루어질 수 "없는" 경우도 있음을 의미합니다.
이런 이유로, 표준이 바이트 값에 접근해야 하는 경우나 문자에 접근해야 하는 경우 (예: mem(), str() 함수들) 에는 모두 unsigned char 로 접근하도록 요구하고 있습니다.
출처 :
그리고, 바이트 단위로 초기화 하기 때문에 int형 배열을 초기화 할 때는 주의해야 한다.
예를 들면 ft_memset(arr, 1, sizeof(arr))을 호출하면 arr 배열이 모두 1로 초기화 된다고 생각하는데, 실제로는 배열이 모두 16843009로 초기화 된다. 16843009의 2진수 표현은 0001 00000001 00000001 00000001 이다. 즉, arr 배열은 1바이트(8비트)당 1로 초기화 된 것이다. 바이트가 딱 떨어지게 초기화 되지 않기 때문에 int형 배열의 요소를 1로 초기화 할 수 없다. 다른 정수도 모두 마찬가지다. 딱 4개의 값만 가능하다고 한다. 0, -1, 0x3f, 0x7f.
출처 :
size_t 자료형은 '이론상 가장 큰 사이즈를 담을 수 있는 unsigned 데이터 타입'으로 정의된다.
이 함수는 source 의 널 종료 문자(null terminating character) 을 검사하지 않는다. 언제나 정확히 num 바이트 만큼을 복사한다.
만일 두 메모리 블록이 겹쳐져 있다면 memmove 함수를 이용해야 한다. src의 원본 값이 이전 src로 바뀐 상태에서 복사를 해버리기 때문이다.
const void* src를 함수 내에서 unsigned char *로 강제 형변환을 하려고 했더니 경고가 떴다. const char 타입으로 받은 인수를 그냥 char 타입으로 다른 변수에 넘겨주려할 때 발생하는 경고라고 한다. 즉 const라는 qualifier(수식어,한정어)가 떨어져 나갔다는 뜻. const unsigned char *로 형변환 해줘야 함.
128 이상의 아스키코드 수도 계산하기 위해서 unsigned char *로의 형변환이 필요했다.
12. ft_atoi
#include "libft.h"
int ft_isspace(char c)
{
if (c == ' ' || c == '\n' || c == '\t' ||
c == '\v' || c == '\f' || c == '\r')
return (1);
else
return (0);
}
int ft_atoi(const char *str)
{
int nbr;
int sign;
int i;
nbr = 0;
sign = 1;
i = 0;
while ((str[i] != '\0') && ft_isspace(str[i]) == 1)
i++;
if (str[i] == '-')
sign = -1;
if ((str[i] == '-') || (str[i] == '+'))
i++;
while ((str[i] != '\0') && ('0' <= str[i]) && (str[i] <= '9'))
{
nbr = (nbr * 10) + (str[i] - '0');
i++;
}
return (sign * nbr);
}
13. ft_isalpha
#include "libft.h"
int ft_isalpha(int c)
{
return (((65 <= c) && (90 >= c)) || ((97 <= c) && (122 >= c)));
}
연산자도 참(1)과 거짓(0)을 반환한다.
14. ft_toupper
#include "libft.h"
int ft_islower(int c)
{
return((97 <= c) && (122 >= c));
}
int ft_toupper(int c)
{
if (ft_islower(c))
return (c - 32);
return (c);
}