programing

8비트 문자 이외의 기능이 있는 플랫폼은 어떤 것입니까?

prostudy 2022. 6. 14. 22:35
반응형

8비트 문자 이외의 기능이 있는 플랫폼은 어떤 것입니까?

때때로 SO에 있는 누군가가 ('바이트'라고 불리는) 반드시 8비트는 아니라고 지적합니다.

8비트의 경우, 8비트인 것 같습니다.char거의 보편적입니다.메인스트림 플랫폼에는 8비트가 필요합니다.char시장에서의 실행 가능성을 보증합니다.

지금까지와 지금까지 모두 어떤 플랫폼이char8비트가 아닌데 왜 일반 8비트와 다를까요?

코드 작성이나 크로스 플랫폼 지원(일반 사용 라이브러리 등)에 대해 생각할 때 8비트 이외의 플랫폼을 고려할 필요가 있는 것은 무엇입니까?char?

과거에 아날로그 디바이스 DSP를 몇 개 접한 적이 있습니다.char16비트입니다.DSP는 좀 틈새 아키텍처라고 생각합니다.(그때는 C 컴파일러를 사용할 수 있는 것보다 손으로 코딩한 어셈블러가 더 쉽게 할 수 있었기 때문에 그 플랫폼에서는 C에 대한 경험이 별로 없었습니다.)

char는 OMAP2에서 출력된 Texas Instruments C54x DSP에서도 16비트입니다.16비트 및 32비트를 사용하는 다른 DSP가 있습니다.char24비트 DSP는 들어본 적이 있는 것 같은데 기억이 안 나서 상상했던 것 같아요.

또 다른 고려사항은 POSIX가 다음을 의무화하는 것입니다.CHAR_BIT == 8POSIX 를 사용하고 있는 경우는, 상정할 수 있습니다.나중에 누군가 POSIX의 거의 구현에 당신의 코드를 이식해야 할 경우, 그것은 당신이 사용하는 기능들이지만 크기가 다를 수 있습니다.char그게 그들의 불운이야

하지만, 일반적으로, 나는 그 문제를 해결하는 것이 생각하는 것보다 거의 항상 쉽다고 생각합니다.그냥 입력해 주세요.CHAR_BIT정확한 8비트 타입을 원하시면int8_t예기치 않은 사이즈를 묵묵히 사용하는 것이 아니라, 코드를 제공하지 않는 실장에서는 코드 컴파일에 노이즈가 발생합니다.적어도, 내가 그것을 추측할 만한 충분한 이유가 있는 사건에 맞닥뜨린다면, 나는 그것을 주장할 것이다.

코드를 작성할 때, 크로스 플랫폼 지원(일반 사용 라이브러리 등)에 대해 생각할 때, 8비트 이외의 문자를 사용하는 플랫폼에 대해 고려할 가치가 있는 것은 무엇입니까?

규칙대로 행동하기 때문에 배려할 가치가 있는 것은 아닙니다.예를 들어 C++에서는 표준에서는 모든 바이트가 "적어도" 8비트를 가집니다.만약 당신의 코드에 바이트가 정확히 8비트를 가지고 있다고 가정한다면, 당신은 표준을 위반하는 것입니다.

"물론 모든 바이트에는 8비트가 있습니다!"라고 말하는 것을 들을 수 있습니다.하지만 많은 똑똑한 사람들이 보장이 되지 않는 가정에 의존해 왔고, 그 후 모든 것이 깨졌습니다.역사는 그러한 사례들로 가득하다.

예를 들어, 대부분의 90년대 초반 개발자들은 대부분의 소비자 CPU의 전력은 거의 같기 때문에 일정한 수의 사이클을 필요로 하는 특정 no-op CPU 타이밍 지연은 일정한 클럭 시간이 걸린다고 가정했습니다.불행하게도, 컴퓨터는 매우 빠르게 빨라졌다.이로 인해 "터보" 버튼이 달린 박스가 생겨났습니다. 아이러니하게도 컴퓨터의 속도를 늦추고 시간 지연 기술을 사용한 게임을 합리적인 속도로 실행할 수 있도록 하는 것이 목적이었습니다.


한 코멘트는 표준에서 char는 최소 8비트를 가져야 한다고 되어 있는 곳을 물었습니다.섹션 5.2.4.2.1에 있습니다.이 섹션에서는CHAR_BIT주소 지정 가능한 최소 엔티티 내의 비트 수로 기본값은 8입니다.또, 다음과 같이 기술되어 있습니다.

구현 정의 값은 같은 부호로 표시된 값과 크기(절대값) 이상이어야 합니다.

따라서 8 이상과 동일한 숫자는 다음 중 하나의 구현으로 대체하기에 적합합니다.CHAR_BIT.

36비트 아키텍처를 사용하는 머신의 바이트 수는 9비트입니다.Wikipedia에 따르면 36비트 아키텍처를 사용하는 머신은 다음과 같습니다.

  • 디지털 이그니션 코퍼레이션 PDP-6/10
  • IBM 701/704/709/7090/7094
  • UNIVAC 1103/1103A/1105/1100/2200,

완전한 휴대용 코드란 없습니다. :- )

네, 바이트/char 사이즈는 다양합니다.네, C/C++는 매우 비정상적인 값을 가진 플랫폼용으로 구현될 수 있습니다.CHAR_BIT그리고.UCHAR_MAX네, 문자 크기에 의존하지 않는 코드를 쓸 수 있는 경우가 있습니다.

그러나 거의 모든 실제 코드는 독립형이 아닙니다.예를 들어 네트워크에 이진 메시지를 보내는 코드를 작성할 수 있습니다(프로토콜은 중요하지 않습니다).필요한 필드를 포함하는 구조를 정의할 수 있습니다.연재할 필요 없이 말이야출력 버퍼에 구조체를 바이너리 복사하는 것만으로는 이식할 수 없습니다.일반적으로 플랫폼의 바이트 순서도 구조체 멤버의 정렬도 모르기 때문에 구조체는 데이터를 보관하고 있을 뿐 데이터의 시리얼화 방법은 설명하지 않습니다.

좋습니다. 바이트 순서 변환을 수행하고 구조 멤버를 이동할 수 있습니다(예:uint32_t또는 유사)의 사용memcpy버퍼에 넣습니다.왜죠memcpy타겟 주소가 올바르게 정렬되지 않은 경우 32비트(16비트, 64비트)를 쓸 수 없는 플랫폼이 많기 때문입니다.

휴대성을 실현하기 위해 이미 많은 노력을 하고 있습니다.

이제 마지막 질문입니다.완충장치가 있어요그 데이터는, TCP/IP 네트워크로 송신됩니다.이러한 네트워크는 8비트바이트를 상정하고 있습니다.문제는 버퍼의 타입입니다.9비트 문자면?16비트인가? 24비트인가? 각 문자가 네트워크로 전송되는 8비트 바이트에 해당하고 8비트만 사용되는가?또는 복수의 네트워크 바이트가 24/16/9비트 문자로 압축되어 있는 경우도 있습니다.그것은 질문이고, 모든 경우에 맞는 하나의 답이 있다는 것을 믿기 어렵다.타깃 플랫폼의 소켓 구현에 따라 많은 것이 달라집니다.

그러니까, 내가 말하는 건.일반적으로 코드는 비교적 쉽게 휴대할 수 있습니다.다른 플랫폼에서 코드를 사용해야 하는 경우 이 작업을 수행하는 것이 매우 중요합니다.그러나 실제 코드는 거의 항상 다른 코드(위의 예에서는 소켓 실장)에 의존하기 때문에 이 기준 이상으로 휴대성을 향상시키는 것은 많은 노력이 필요하고 거의 효과가 없습니다.8비트 이외의 바이트를 가진 플랫폼에서 동작하는 코드 능력의 약 90%는 8비트로 바인드된 환경을 사용하기 때문에 거의 쓸모가 없을 것입니다.바이트 크기를 확인하고 컴파일 시간 어설션을 수행합니다.매우 특이한 플랫폼을 위해 많은 것을 고쳐 써야 할 것입니다.

하지만 코드가 매우 "독립형"이라면, 왜 안 될까요?다른 바이트 크기를 허용하는 방법으로 쓸 수 있습니다.

내가 본 것 중 가장 이상한 것은 CDC 컴퓨터였다.6비트 문자이지만 65개의 인코딩이 있습니다.[또한 OS 설치 시 인코딩을 선택할 수 있는 경우 인코딩을 선택합니다.]

60 워드가 12, 18, 24, 30, 36, 40, 또는 48 비트의 0으로 끝나는 경우는, 행의 끝 문자(예:'\n').

00(옥탈) 문자는:일부 코드 세트에서는 BNF를 사용하여::=서먹서먹했다::잘못된 열에 떨어졌습니다.[C++ 및 기타 일반적인 용도는 C++보다 오래 전에 사용되었습니다]::.]

그 중 몇 가지는 알고 있습니다.

  • DEC PDP-10: 가변적이지만 대부분의 경우 36비트 워드당5 또는 9비트 문자, 워드당4
  • Control Data 메인프레임(CDC-6400, 6500, 6600, 7600, Cyber 170, Cyber 176 등)6비트 문자, 60비트 워드당 10패킹.
  • Unisys 메인프레임: 9비트/바이트
  • Windows CE: 단순히 "char" 타입을 전혀 지원하지 않습니다.대신 16비트 wchar_t가 필요합니다.

DEC PDP-8 패밀리는 12비트 워드를 가지고 있었습니다만, 통상은 8비트 ASCII 를 출력에 사용했습니다(대부분의 Teletype 에서는).단, 1개의 12비트 워드에 2개의 문자를 부호화할 수 있는6비트 문자 코드도 있었습니다.

8비트 이외의 문자를 사용하는 플랫폼에는 어떤 점을 고려할 필요가 있습니까?

매직 넘버는 예를 들어 이동 시 발생합니다.

이들 대부분은 CHAR_B를 사용하여 간단하게 처리할 수 있습니다.IT 및 UCHAR_MAX (8 및 255(또는 이와 유사) 대신)

구현에 의해 다음이 정의되기를 바랍니다.

이것들은 「흔한」문제입니다.

또 다른 간접적인 문제는 다음과 같습니다.

struct xyz {
   uchar baz;
   uchar blah;
   uchar buzz; 
}

이것은 하나의 플랫폼에서 24비트를 취할 수 있지만(최적의 경우) 다른 곳에서는 72비트를 취할 수 있습니다.

각 uchar가 "비트 플래그"를 보유하고 있고 각 uchar가 현재 사용하고 있는 "중요한" 비트 또는 플래그를 2개만 가지고 있으며, "비밀"을 위해 3개의 uchar로 구성했을 경우 24비트 uchar를 사용하는 플랫폼에서는 상대적으로 "더 낭비적인" 경우가 있습니다.

비트필드로 해결할 수 있는 것은 없지만, 그 밖에도 주의해야 할 점이 있습니다.

이 경우, 1개의 열거형만으로 실제로 필요한 "정수" 크기의 정수를 얻을 수 있습니다.

실제의 예는 아닐지도 모르지만, 어떤 코드로 이동하거나 플레이 할 때, 이러한 것이 「물어 버린다」라고 하는…….

uchar가 예상한 것보다 3배 크면 일부 플랫폼에서는 100개의 이러한 구조가 많은 메모리를 낭비할 수 있습니다.이러한 구조에서는 큰 문제가 되지 않습니다.

따라서 uchar가 다른 플랫폼보다 사용 가능한 RAM에 비해 어떤 플랫폼에서는 "매우 낭비하지 않는다"는 가정 하에 "매우 많은 메모리를 빠르게 낭비한다"고 할 수 있습니다.

이 문제는 int나 기타 유형에서도 더 두드러질 수 있습니다.예를 들어 15비트를 필요로 하는 구조를 가지고 있기 때문에 int에 고정합니다만, 다른 플랫폼에서는 int가 48비트인지 어떤지는 알 수 없습니다.

"param"은 2개의 uchar로 나눌 수 있지만, 예를 들어 24비트 uchar를 사용하는 경우에는 1개만 필요합니다.

따라서 열거형이 더 나은 "확실한" 솔루션이 될 수 있습니다.

는, 이러한 비트에의 액세스 방법에 따라 다릅니다.

그 때문에, 「디자인상의 결함」이 머리를 드는 경우가 있습니다.uchar나 uint의 크기에 관계없이 코드가 정상적으로 작동/실행하더라도...

당신의 코드에는 '수치'가 없더라도 이와 같은 점에 주의해야 할 점이 있습니다.

이 말이 맞기를 바랍니다:)

IM6100(칩 상의 PDP-8)은 창고에서 구입할 수 있습니다.12비트 아키텍처입니다.

많은 DSP 칩은 16비트 또는 32비트를 탑재하고 있습니다.char를 들어, TI는 일상적으로 이러한 칩을 만듭니다.

예를 들어 C 및 C++ 프로그래밍 언어에서는 바이트를 "실행 환경의 기본 문자 집합의 멤버를 보유하기에 충분히 큰 데이터 단위"로 정의합니다(C 표준의 조항 3.6).C char 적분 데이터 타입은 적어도8비트(조항 5.2.4.2.1)를 포함해야 하므로 C의 바이트는 적어도 256개의 다른 값을 유지할 수 있습니다.C 및 C++의 다양한 구현에서는 바이트를 8, 9, 16, 32 또는 36비트로 정의합니다.

http://en.wikipedia.org/wiki/Byte#History에서 인용

다른 언어들은 잘 모르겠는데.

http://en.wikipedia.org/wiki/IBM_7030_Stretch#Data_Formats

해당 시스템의 바이트 길이를 가변 길이로 정의합니다.

예를 들어 유니코드 문자는 8비트보다 깁니다.앞에서 설명한 바와 같이 C 사양은 데이터 유형을 최소 크기로 정의합니다.사용하다sizeof및 의 가치limits.h데이터 유형을 조사하고 구성 및 아키텍처에 맞는 데이터 크기를 정확하게 파악하려면 다음과 같이 하십시오.

이러한 이유로 저는 다음과 같은 데이터 유형을 고수하려고 합니다.uint16_t특정 비트 길이의 데이터 타입이 필요한 경우.

편집: 죄송합니다. 처음에 질문을 잘못 읽었습니다.

C사양에 따르면char개체가 "실행 문자 집합의 모든 구성원을 저장할 수 있을 만큼 충분히 큽니다." limits.h최소 사이즈는 8비트이지만 정의에서는 최대 사이즈는 그대로입니다.char열다.

따라서 a는char는 아키텍처 실행 세트의 최대 문자(일반적으로 가장 가까운 8비트 경계로 반올림) 이상입니다.아키텍처의 opcode가 길면char사이즈가 길어질 수 있습니다.

지금까지 x86 플랫폼의 opcode 길이는 1바이트였습니다.char는 처음에 8비트 값이었습니다.현재 x86 플랫폼은 1바이트 이상의 opcode를 지원하지만char프로그래머(및 대량의 기존 x86 코드)가 8비트 길이로 조정되기 때문에 8비트 길이로 유지됩니다.

멀티플랫폼서포트에 대해 생각할 때는 에 정의되어 있는 타입을 활용하십시오.stdint.h(예를 들어) uint16_t를 사용하는 경우, 이 값이 어떤 아키텍처에서도 부호 없는 16비트 값인지 확인할 수 있습니다.이 값은 16비트 값에 대응하고 있는지,char,short,int, 또는 다른 것.대부분의 어려운 작업은 컴파일러/표준 라이브러리를 작성한 사람들이 이미 수행하고 있습니다.

정확한 사이즈를 알고 싶다면char필요한 낮은 수준의 하드웨어 조작을 하고 있기 때문에, 저는 보통 데이터 타입을 사용하고 있습니다.char(통상은 16비트로 충분) 모든 지원 플랫폼 상에서 값을 실행합니다.convert_to_machine_char정확한 기계 표현이 필요할 때 루틴을 실행합니다.그러면 플랫폼 고유의 코드가 인터페이스 기능에 한정되어 대부분의 경우 일반 코드를 사용할 수 있습니다.uint16_t.

ints는 이전에는 16비트(pdp11 등)였습니다.32비트 아키텍처로의 이행은 어려웠습니다.사람들은 점점 나아지고 있다:포인터가 오래 들어갈 거라고 생각하는 사람은 거의 없다(그렇지 않은가?또는 파일 오프셋, 타임스탬프, 또는...

8비트 문자는 이미 다소 시대착오적이다.전 세계의 모든 문자 집합을 저장하기 위해 이미 32비트가 필요합니다.

언급URL : https://stackoverflow.com/questions/2098149/what-platforms-have-something-other-than-8-bit-char

반응형