Language/C 4

Signed / Unsigned 의 비교

signed 의 경우 양/음수를 표현할 수 있는 변수형으로 알고 있고, unsigned 의 경우 양수만 표현할 수 있는 것으로 막연히 알고 있었는데, 코드로 실제 비교해 보았다. #include int main() { signed char a = 0xFF; unsigned char b = 0xFF; printf("a = %d\n", a); printf("b = %d\n", b); } [결과] a = -1 b = 255 2진수 (16진수) 10진수 (signed char) 10진수 (unsigned char) 1111 1111 (0xFF) -1 255 signed char 의 경우 이진수 1111 1111 중 MSB (Most Significant Bit) 는 부호 표현을 위해 사용된다. 이에 2의 보수법..

Language/C 2019.08.24

Type casting 시 주의해야할 점. (signed, unsigned)

socket을 통해 받아들이는 1 byte (8 bit) 정보를 처리해야 할 일이 생겼다. 해당 값은 0xEE(10진수: 238) 이었다. 0xEE는 0xFF(256)보다 작은 값으로 8 bit만으로 처리가 가능한 값이다. 이에 아래와 같이 송수신하도록 코드를 작성하였다. unsigned int len;char sendbuf[4]; len = 238;sendbuf[0] = len; 이후 sendbuf 송신.........unsigned int len; char receivebuf[4]; receivebuf에 수신........... len = *(receivebuf+1); 송신측에서 전송한 238(0xEE)를 그대로 수신하여 변수에 저장할 것이라고 예상하였지만 결과는 -18로 저장되고 말았다. unsig..

Language/C 2016.07.04

sizeof - 함수가 아닌 연산자.

C언어를 접한지도 오래되었지만 때때로 내가 이리도 모르는 부분이 많았던가 하는 생각이 종종 들곤 한다. 그리도 많이 써왔던 sizeof에 대해 좀 더 정확한 사용 방법을 알아보기 위해 man page를 찾아보았는데, 아무리 man sizeof 를 해보아도 man page가 나오질 않았다. 혹시나 내가 미처 설치하지 못한 package가 있는가 해서 나오질 않는 것인가 해서 좀 찾아보았다. 수 많은 sizeof 관련 글 가운데 sizeof는 함수가 아니라 연산자여서 man page가 없다는 글을 보게 되었다. 순간 이게 무슨 소리 인가 했다. man page가 없는 이유가 연산자여서 라는 건가....연산자인데 왜 man page가 없는 거지???? 우선 연산자이기 때문에 man page가 없다 .==> 연..

Language/C 2016.07.04

memset - 하위1byte pattern 의 이해

대체로 남들이 짜놓은 코드만 바라보다 보니, 막상 직접 짜게되니까 부딪치는 문제들이 다발하기 시작했다. 백문이 불여일타라고 했던가. 아무리 코드를 계속 보아도 실제 쳐보는 것과는 판이하게 다르더라. 학부때 당연하게 사용했던 메모리 초기화까지도 이제는 가물가물해졌다. memcpy(&a, 0, sizeof(a)); 이렇게 해놓고 자꾸 segmentation fault가 나는 원인을 찾아보겠다고 한동안 계속 삽질을 하였다.참 어이없는 실수가 아닐 수 없지만 오랜만에 직접짜다 보니 이런 일이 계속 생긴다. 위 memcpy는 0으로 초기화하는 것이 아닌 0번 주소부터 변수 a 크기만큼 복사를 해 오는 것이다. 0번 주소는 일반 application이 접근할 수 없는 주소라 접근하는 순간 죽어버린다. memset(..

Language/C 2016.07.01