내가 C/C++ 표준을 엄청 강조하는 편인데, 사실 C/C++ 표준 코드라는건 짜기가 굉장히 어려워.
표준에서 데이터 타입의 크기를 정하지 않는다는 사소한 것에서부터, 부호화 정수가 1의 보수인지 2의 보수인지도 정해진 바 없기 때문에 MSB가 1이면 음수라고 판단하는 trick 마저도 사실은 표준 문법에 따라 잘 코딩한다고 해도 원하는 대로 동작하지 않을 수 있어.
이건 특히 signed integral에서 좀 심한데, 사실 표준에서는 INTMAX + 1조차도 undefined behavior이고, unsigned int -> signed int 도 unsigned int의 값이 signed int 범위를 벗어나면 undefined behavior야.
unsigned int a = UINT_MAX;
int b = a; // UNDEFINED BEHAVIOR!!!
컴파일러가 딱 보고 a가 int 표현 범위를 벗어나는구나!! undefined behavior니까 그냥 b = 0으로 세팅해야지!! 라고 해도 표준에 어긋나는 동작이 아니라는거지.
다만 signed int -> unsigned int 동작은 잘 정의되어 있어서 unsigned int a = -1; 에서 a가 unsigned int로 표현할 수 있는 최대값이 되는 것은 보장되어 있어.
거기다 char의 비트수조차도 정해놓지 않기 때문에 하위 바이트들의 값을 얻고자 하는 다음 코드도 사실은 portable한 코드는 아냐.
unsigned int a = something;
unsigned char BYTE_1 = (a & 0xff00) >> 8;
unsigned char BYTE_0 = a & 0xff;
진짜 표준에 맞춰 짜려면 다음처럼 짜야해.
unsigned char BYTE_1 = (a & (((unsigned char)-1) << CHAR_BITS)) >> CHAR_BITS;
unsigned char BYTE_0 = a & ((unsigned char)-1);
또 다른 예를 들자면 포인터의 alignment 관련해서인데, memcpy나 strlen을 구현하다보면 포인터를 long이나 uintptr_t로 형변환해서 alignment를 검사하는 코드들이 많아.
void *ptr;
unsigned long a = (unsigned long)ptr;
if(a % alignof(unsigned long) == 0) {
// ptr이 align되어있구나!!
}
근데 이 코드는 여러가지 면에서 표준에 맞지 않는 코드야.
일단 1) 포인터의 크기가 unsigned long보다 클 수 있다 는 점과 2) 포인터를 정수로 형변환했을 때 그게 우리가 흔히 생각하는 메모리 주소를 나타낼 거라는 보장이 없다 라는 점이야.
1에 대해선 uintptr_t 쓰면 되지 않느냐할 수 있는데 uintptr_t는 optional typedef라 환경에 따라 uintptr_t가 제공되지 않을 수 있어. sizeof(long long)은 64bit인데 sizeof(void*)가 128bit 인 시스템 정도를 예로 들 수 있겠지. 이런 시스템에선 포인터를 정수로 표현하는 것 자체가 불가능해.
그나마 POSIX를 따른다거나 C++을 사용한다면 posix_memalign이나 std::align을 이용해서 alignment를 확인할 수 있지만 표준 C만으로는 alignment를 확인하는 일조차 불가능해.
결국 프로그래머는 선택을 해야해. 표준에 엄격히 부합하는 코드를 짤 것인가, 아니면 대부분의 환경에서 만족하는 1 byte = 8 bit 같은 가정 하에 코드를 짤 것인가. 이 부분이 사실상 C/C++을 다루는데에 있어서 가장 어려운 부분인 것 같아.
그럼 표준이 무슨 소용이냐 그냥 돌아가게만 짜면 되겠네 할 수도 있는데, 내 생각에 표준이라는 건 사실상 유니콘 같은거야.
현실 세계에선 없지만, 유니콘이 없다 해서 염소를 타는 것보단 말을 타는게 좋겠지.
오늘도 즐거운 하루 되길 바라~
어차피 내가 임베디드 프로그래밍을 한다 - 라고 하면 타깃이 되는 장치에 대해 조사하는 건 기본이야. 아주 일부 예외적인 환경을 들먹이면서 표준 딸 치는 건 좀 아닌 듯.
C 표준 안 지키는 임베디드 C 컴파일러나, CHAR_BIT != 8인 컴파일러나 수가 압도적으로 적은 건 동일하니까 똑같은 걸로 치는 거지 뭐.
표준을 지키려고 노력하는 건 맞는데, 그렇다고 너무 강박적으로 표준을 지키려고 하면 잃는 게 더 많다는 얘기임.
벡칩(BeckChip) 안 써봤냐? 거긴 표준 C로 짠 코드도 컴파일 안되던데? ㅎㅎ 모름지기 임베디드 프로그래머라면 자기가 타깃으로 하는 임베디드 장치에 대해 조사하는 건 기본 중의 기본이야.
너 같은 애들 땜에 64비트로 넘어갈 때 문제가 많았던거다. int가 4바이트겠거니 하고 짜는거랑 뭐가 다르냐. 자꾸 비표준 컴파일러 얘기하는데 표준 얘기하는 중에 비표준 컴파일러도 배려해야한다는거냐? 뭔 자꾸 말도 안되는 얘길 끌어와. 비표준 컴파일러는 그거 쓰는 놈이 알아서 책임질 일인거고.
표준어 지키자는 글에 좆나 사투리 끌고 오고 있네
long long int가 나왔는데 int 마저 8바이트 정수로 바꿔버리면, 4바이트 정수는 뭘로 써? int가 8바이트가 되지 않고 4바이트로 남아있는 환경도 있는 건 이런 발상에서인데?
난 경기도 사투리(de facto standard) 얘기하는 건데.
닌 표준어(C standard).
응 사실 나도 int는 4 byte로 남는 것이 좋다고 생각하지만 long은 완전 중구난방임.
표준어 사투리 얘기하는 중에 외국인(비표준 컴파일러) 끌고 오지 마라
글고 4바이트 타입이 없기 때문에 int가 4바이트가 되어야한다는 말은 의미없는 말이야. 그건 implementation에서 정할 문제인거고 표준 얘기할 때는 상관이 없는 토픽임.
임베디드 프로그래밍 하면서 외국인(비표준 컴파일러)을 만날 확률이랑, 경기도 사투리(de-facto standard)가 안 먹히는 표준어 강박증 컴파일러 만날 확률이랑 비슷하다고 보는데?
그래서 임베디드 프로그래밍할 때는 자기가 타깃으로 하는 장치에 대해 조사하는 건 기본이라고 밝힌 거고.
최대값->최댓값
표준C 컴파일러가 아니면 그건 C가 아니라 C문법을 차용한 다른 언어일 뿐이여. 지금 C 얘기하잖니
글고 sizeof(short) == sizeof(int) == sizeof(long) == sizeof(long long) == 64라도 C 표준에는 어긋나지 않아. 그냥 하드웨어를 제어하기가 귀찮아질 뿐이지. 데이터 타입 크기에 대한 내용이랑 char의 비트수랑은 다른 얘기여. 자꾸 딴 거 끌고 오지 말어
뭔 소리임. embedded device 중에는 표준 C 스펙을 스펙 상의 문제로 다 지원하지 못해 일부만 지원하는 장치도 얼마나 많은데.
sizeof(short) == sizeof(int) == sizeof(long == sizeof(long long) == 8 이면 뭐하러 타입을 저렇게 다 나누냐 ㅎㅎ 하나로 하지.
타입을 여러 개로 만든 이유가 뭔데? 애초에 말야.
아 좆나 못알아듣네. 디바이스가 표준 C 스펙을 지원 못하는게 아니라 컴파일러가 지원을 못하는거겠지.
컴파일러가 지원을 안하는 경우도 있고, 하드웨어적 문제로 지원을 안하기도 하는데? 경험 부족 티가 여기서 나는구나.
https://en.wikipedia.org/wiki/64-bit_computing
에서 64-bit data models 보고 와라.
하드웨어 문제로 C 표준 문법 지원 안하는거 하나만 예로 들고 와봐.
진짜 진심 하나만 들고 와봐라
ㅎㅎ 난 수백만년 전에 본 글을 읽으라고 링크한 겨?
니가 8비트 프로세서를 안 만져봤구나?
ㅋㅋㅋㅋㅋ 그래서 8비트 프로세서에서 C표준에서 뭘 지원을 못하는데? 얘기를 해봐 만져봤네 안만져봤네 딸치지 말고
64-bit data models 이 저렇게 범람하게 된 건 backward compatibility 때문이잖아 바부야.
진심 딴 얘기 말고 하드웨어 땜에 표준C 지원 못하는거 딱 하나만 들고 와 나도 제발 알고 싶다.
키워드 던져줬으면 니가 찾아봐. 나 지금 바쁘니깐.
시발 니 놈 때문에 할 일도 못하고 있잖. 키배 뜨느라 ㅡ.,ㅡ
그럼 빠이~
ㅋㅋㅋㅋㅋㅋㅋㅋ 바로 딸치고 있네 나중에 한가할 때 생각나면 들고 와봐라 기다릴테니까
8비트 프로세서에서 long int 범위 지원하는 거 있으면 너나 가져와 봐. 나도 기다릴테니까 ㅇㅋ?
Intel 4004 (4비트 프로세서) 에서는 될까? 아마 안되겠지? ㅎㅎ
에니악에서는 될까? 아마 안될거야...
sizeof(long int) == 1이래도 표준에 전혀 어긋남 없어 바부야
된다고 생각하면 언제든지 근거 들고와. 기다릴게 ㅎㅎ
표준에 정의된 LONG_MIN, LONG_MAX 의 값은?
sizeof(char) == sizeof(short) == sizeof(int) == sizeof(long) == sizeof(long long)이라도 상관없다. 표준에서 명시하는건 오로지 sizeof(char) <= sizeof(short) <= ... <= sizeof(long long) 이여
ㅋㅋㅋ 표준에 LONG 최대값이 숫자로 표현되어있디? 내가 찾아서 갖다 주마 어떻게 정의되어 있나
응. 천년이고 만년이고 기다리마. 도망가지나 말고 ㅎㅎ
표준도 잘 모르는 새끼가 표준 딸 치는 것도 웃기네 ㅎㅎ
C99 말고 ANSI C 로도 함 찾아와봐. 기다릴게~ ♡
병먹금 병신아 뭘 일일히 답하고있냐
ㄴ일일히->일일이
LONG_MAX maximum value for an object of type long int +2147483647 : long 타입이 표현할 수 있는 최대의 수
자 여기에 어디 sizeof(long)이 정의되어 있나 설명해봐라
저 뒤의 숫자는 저것보다 큰 수를 표현할 수 있어야 한다는 표현이 있다.
그니까 LONG_MAX가 2147483647 일 필요는 없고 저거보다 크기만 하면 됨
글고 8bit라서 long int가 안된다는 개소리는 하지 마라. 32bit cpu에서도 long long 잘 지원한다. 컴파일러가 레지스터 여러개로 쪼개서 연산을 하는 오버헤드가 있을 뿐.
마찬가지로 8 bit에서도 sizeof(long long) == 8로 되어있는 환경이라도 전혀 문제 없다.
내 살다살다 8bit에서 long 지원 못한다는 개소리는 또 첨 들어보네. 8 bit register 하나로 표현 못한다고 했으면 이해라도 하지
최신 표준에서 int8_t는 optional이되 int_least8_t는 꼭 있어야하는 것도 다 이유가 있는 법이다. 좆나 변태스럽게 CHAR_BIT이 31인 시스템을 만들어도 표준 C를 구현하는데는 전혀 지장이 없네요.
표준에서 크기에 관해 명시하는건 char의 비트수가 8 이상, short와 int의 bit수가 16 이상, long의 비트수가 32 이상, long long의 비트수가 64비트 이상이어야한다는건 말곤 저어어어어어언혀 언급이 없다.
다른 말 다 필요없고 이것만 복사해 주마. kukyak.. sizeof(long int) == 1이래도 표준에 전혀 어긋남 없어 바부야 143.248.*.*
C 표준도 제대로 모르는 놈 인정?
븅신아 CHAR_BIT이 64인 환경이면 sizeof(long int) == 1이 가능하다. CHAR_BIT이 8이라는 가정을 깔고 가니까 이딴 소릴 지껄이지.
에잇. 병먹금해야지. 그럼 수고~ㅎㅎ
C 표준도 제대로 모르는 놈 셀프인증 좆나게 하네. 애초에 byte가 8 bit라고 정의가 안되어있구만 어디서 자꾸 개소리여
딸치지 말고 하드웨어 때문에 C 표준 못지키는 예나 찾아와.
CHAR_BITS가 8이 아닌 컴퓨터는 거의 드물다니깐? 아까 니가 언급했던 그 CHAR_BITS가 16이라고 했던 모델 제대로 된 모델 풀 네임 적어봐라. '어떤 애'라고만 하지 말고 ㅎㅎ 실제론 없는 거 아녀?
그거부터 제대로 답하면 나도 제대로 답한다.
니부터 제대로 답 안해놓고 누구보고 답변하라 마라임?
아이 씨팔 드문거랑 C 표준이랑 무슨 상관이냐? 기다려봐 TI 홈피에서 리스트 링크 갖다 붙여줄게
kuku횽말이표준에맞음 ㅅㄱ
http://www.ti.com/sitesearch/docs/universalsearch.tsp?searchTerm=TMS320C54#linkId=2
http://www.ti.com/lit/ug/spru103g/spru103g.pdf
여기도 1.2.1에 The C54x C/C++ compiler fully conforms to the ISO C standard as definedby the ISO specification 이면서 7.3.6에 CHAR_BIT 16이라고 해놨다 눈깔이 있으면 좀 봐라
자 이제 하드웨어 때문에 C 표준 제공 못하는 예를 가져와
병먹금은 시팔 내가 해야할 말이고마 표준도 제대로 이해 못한 새키가 어디서 자꾸 표준표준 아후 시팔
넌 씨발 내가 퇴근하고 조져준다.
어쨌든 CHAR_BIT > 8 인 최근 환경도 있다는 건 인정하마. 근데 내가 위에서부터 계속 주장하고 있는 논지랑은 상관 없는 내용이긴 해. 그런 환경 신경쓰는 거랑 C 표준 제대로 지원 못하는 컴파일러 신경쓰는 거랑 비슷한 짓이라는거.
그리고 내가 덧붙였잖아. 임베디드 프로그래밍은 자기가 타깃으로 하는 장비에 대해 조사하는 것이 기본이라고.
아니 표준에는 hardware specific 한 내용이 없다는데 무슨 자꾸 장비를 조사해. 나도 저녁먹으러 나왔으니까 이따 퇴근하고 표준 문서 들고 글 파라. 표준 얘기하는데 자꾸 비표준 컴파일러 얘기하지 말고
별것도 아닌 것들로 싸우시네요. 플랫폼에 따라 맞게 잘만 굴러가면 되지
구경하고 갑니다
하이고 병신들 시간 참 많네~
표준은 어려워@_@
ㅋㅋㅋㅋ 여긴 왜 또 콜로세움열렸냐
팝콘은 캬라멜이지 ㅇㅅㅇ
이거 ㅅㅅㅅ가 병신이네
애초에 C 표준 디바이스가 비트가 달라 표준 코드 짜기 어렵다는 이야기에 8비트로 짜면 된다고 우기다가 표준 16비트 디바이스도 있다는 말에 표준 안지키는 디바이스 많다고 물타기ㅋㅋㅋ
표준으로 비트가 안정해져있어서 표준 코딩이 힘들다는 글의 반례로 비표준 디바이스도 많다가 논리적으로 반례가 된다고 생각하는건가 ㅋㅋㅋ
꿀잼
https://en.wikipedia.org/wiki/C99#Implementations
(cc65 / Partial / Full C89 and C99 support is not implemented, partly due to platform limitations (MOS Technology 6502). There is no support planned for some C99 types like _Complex and 64-bit integers (long long).[14])
쿠캬캬가 병신이라는 증거.
쿠캬캬가 요구한 "kukyak.. 딸치지 말고 하드웨어 때문에 C 표준 못지키는 예나 찾아와.143.248.*.*" 에 대한 답. 컴퓨터 아키텍처에 대한 이해가 있다면 굳이 예를 들지 않아도 충분히 있을 수 있다고 생각하기 마련인데 컴퓨터 아키텍처에 대한 몰이해 인증.
ㅅㅅㅅ 이 병신은 뒈지지도 않고 또 왔네. 눈깔이 있으면 다시 읽어봐라 저게 6502 하드웨어 제약 땜에 c표준을 구현 못한다는건지 cc65컴파일러가 구현을 안했다는건지. 이 새끼는 눈이 없나 챕터 제목도 못보네.
슬슬 C 표준이랑 구현체랑 구분을 못하는 새끼가 아닌가 하는 생각이 든다. Visual Studio에서 C99를 fully 지원을 안하다고 x86 하드웨어 제약 땜에 표준 구현 못한다고 할 새낄세.
싸우는것도 프로그래밍관련으로 싸우니까 머가리아프네....
그래서 누가 이겼냐
세상에... 자기는 CHAR 가 16비트인 TI 들먹이면서 ㅉㅉ. 글은 조악한 코드 제외하곤 읽을만했는데, 댓글 노는 꼴 보니 수준이 처절하구나.
300원 ~500원 짜리 마이콤 못써봤니? 메모리 128바이트 달려있는 수준. 거기다 C 언어 표준을 지원하겠냐? 어셈블러 밖에 제공 안한다. 그런 경우는 하드웨어의 한계로 C언어의 표준을 지원하지 못하는 경우가 맞나 아니냐?
지가 예를들면 다 옳으신 말씀이고 남이 인터랙션하면 개소리지응~? ㅉㅉ
니가 프로그래밍을 그렇게 잘하면 나한테 덤벼라. 아가리만 털지 말고.
지난번에 뭐? 보안 까는 이야기 했더니 잘나가다가 시궁창? 니 아가리가 시궁창이겠지. ㅋㄷ 남 생각은 전혀 들으려고 하지 않는 새끼
너같은 병신한테 병신이라고 이야기해주는것도 입아프니, 프로그래밍 실력으로 덤비든지 뒤에서 열심히 궁시렁거리든지. 욕구불만 장애자같은새끼. 사회생활은 가능하냐?
ㅅㅅㅅ랑 수준 똑같은 병신새끼 하나 더 있었지 참. C 언어 표준에 용량 들먹이는 새끼들이 왜케 많은지, 표준 문서 한번이라도 읽어봤으면 이딴 개소리는 안할텐데. 표준에는 hosted와 freestanding이라는 두가지 구현 form이 있어요. 병신같은 망상은 허언증갤에서나 하고 표준 문서 한번이라도 좀 읽어봐 띨빡아 에휴 그래봐야 읽어보지도 않고 개소리만 하겠지만.
세상은 넓고 병신은 많지.