programing

서명되지 않은 문자란?

prostudy 2022. 4. 29. 23:11
반응형

서명되지 않은 문자란?

C/C++에서는 어떤 것이unsigned char용도는?일반인과 어떻게 다른가.char?

C++에는 다음과 같은 세 가지 고유한 문자 유형이 있다.

  • char
  • signed char
  • unsigned char

텍스트에 문자 유형을 사용하는 경우, 정규화되지 않은 문자 유형을 사용하십시오.char:

  • 그것은 다음과 같은 성격의 문학자들이다.'a'또는'0'(C++에서만, C에서 유형은int)
  • 그것은 C 문자열을 구성하는 유형이다."abcde"

숫자값으로도 동작하지만, 그 값이 서명된 것으로 처리되는지, 서명되지 않은 것으로 처리되는지는 불분명하다.불평등을 통한 성격 비교를 주의하라 - 비록 당신이 스스로를 ASCII(0-127)로 제한한다면 당신은 거의 안전할 것이다.

문자 유형을 숫자로 사용하는 경우:

  • signed char적어도 -117 ~ 127 범위(-117 ~ 127은 일반적임)를 제공하는 제품.
  • unsigned char, 최소 0 ~ 255 범위의 값을 제공한다.

"적어도" 왜냐하면 C++ 표준은 각 숫자 유형이 포함해야 하는 최소 범위의 값만 제공하기 때문이다. sizeof (char)1(즉, 1바이트)이 되어야 하지만 이론상 바이트는 예를 들어 32비트가 될 수 있다.sizeof 그 크기는 당신이 가질 있다는 의미로 여전히 보고될 것이다.sizeof (char) == sizeof (long) == 1.

이것은 C 표준이 서명한 ness를 정의하지 않기 때문에 구현에 따라 달라진다.char플랫폼에 따라 char는signed또는unsigned그러니까 명시적으로 물어봐signed char또는unsigned char구현에 의존하는 경우.그냥 사용해char문자열에서 문자를 나타내려는 경우, 플랫폼이 문자열에 입력한 것과 일치하므로

과의 signed char그리고unsigned char네가 예상했던 대로야대부분의 플랫폼에서,signed char다음 범위의 8비트 2의 보완 번호가 될 것이다.-128127그리고unsigned char 없는 이다(8는 정 수 있다).0255). 점에 표준은 다음과 같은 것을 요구하지 않는다는 점에 유의하십시오.char타입은 8비트를 가지고 있다, 오직 그것만.sizeof(char)돌아오다1...로 한 를 알 수와 함께 한 글자의 비트 수를 알 수 있다.CHAR_BITlimits.h오늘날 이것이 다른 무언가가 될 플랫폼은 거의 없다.8그래도.

여기에 이 문제에 대한 멋진 요약이 있다.

내가 이걸 올린 이후로 다른 사람들이 말했듯이, 너는 사용하는 게 더 좋아.int8_t그리고uint8_t만약 당신이 정말로 작은 정수를 대표하고 싶다면.

서명되지 않은 문자의 사용 예:

unsigned char컴퓨터 그래픽에 자주 사용되는데, 컴퓨터 그래픽은 매우 자주(항상 그렇지는 않지만) 각 색상 구성요소에 단일 바이트를 할당한다.RGB(또는 RGBA) 색상은 각각 24비트(또는 32비트)로 표시되는 것이 일반적이다.unsigned char부터.이후unsigned char값은 [0,198] 범위에 속하며, 값은 일반적으로 다음과 같이 해석된다.

  • 0은 주어진 색상 구성요소의 총 부족을 의미한다.
  • 255는 주어진 색소의 100%를 의미한다.

따라서 RGB 적색은 (255,0,0) -> (100% 적색, 0% 녹색, 0% 청색)으로 끝나게 된다.

a를 사용하지 않는 이유signed char산술과 비트 이동은 문제가 된다.이미 설명한 바와 같이 asigned char의 범위는 기본적으로 -csv에 의해 이동된다.RGB를 그레이스케일로 변환하는 매우 간단하고 순진한 방법(대부분 사용되지 않음)은 세 가지 색상 구성요소의 평균을 산출하는 것이지만, 색상 구성요소의 값이 음수일 때는 문제가 발생한다.빨간색(255, 0, 0)을 사용할 때 평균은 (85, 85, 85)unsigned char산술의그러나 값이 다음과 같다면signed char, -99, s (-99, -99, -99 ( (29, 29, 29 즉 (29, 29, 29)로이다.unsigned char공간, 그것은 틀렸다.

unsigned char부호 없는 바이트 값(0 ~ 255)이다.라고 생각하고 있을지도 모른다.char"캐릭터"라는 측면에서 볼 때, 그러나 그것은 정말로 숫자적인 값이다. 정규.char서명되었으므로 128개의 값이 있으며, 이 값은 ASCII 인코딩을 사용하여 문자에 매핑된다.그러나 어느 경우든 당신이 메모리에 저장하고 있는 것은 바이트 값이다.

나는 그것이 정말로 요구된다고 느끼기 때문에, C와 C++의 몇 가지 룰을 진술하고 싶을 뿐이다(이 점에서는 동일하다).첫째로, 모든 부분의unsigned char서명되지 않은 자가 이의를 제기할 경우 값을 결정하는 데 참여하십시오.둘째unsigned char명시적으로 서명되지 않은 것으로 되어 있다.

자, 나는 누군가에게 당신이 가치를 변환할 때 어떤 일이 일어나는지에 대해 의논했다.-1에 맞는unsigned char는 그 로 생긴 것이 그 때라는 을 unsigned char모든 비트가 1로 맞춰져 있는데, 왜냐하면 그는 수화 표현에 대해 걱정했기 때문이다.하지만 그는 그럴 필요가 없었다.변환이 의도된 대로 수행된다는 것은 이 규칙에서 즉시 벗어난다.

새로운 타입이 서명되지 않은 경우, 그 값이 새로운 타입의 범위에 있을 때까지 새로운 타입으로 나타낼 수 있는 최대값보다 1을 더 가감하여 반복적으로 값을 환산한다.(6.3.1.3p2C99 초에에)

그건 수학적인 묘사야.C++는 같은 규칙으로 산출되는 modulo 미적분학(modulo miculus)의 관점에서 설명한다.어쨌든 보장되지 않는 것은 정수의 모든 비트가-1개종 전에 하나야그럼, 우리가 뭘 가지고 있는거지? 그래서 우리는 그 결과물이라고 주장할 수 있다.unsigned char모든 것을 가지고 있다CHAR_BIT비트가 1로 바뀌었는가?

  1. 모든 비트는 값을 결정하는 데 참여한다. 즉, 개체에서 패딩 비트가 발생하지 않는다.
  2. 한 번만 추가UCHAR_MAX+1-1범위로 값을 산출할 수 있다.UCHAR_MAX

사실 그 정도면 됐어!그래서 너가 원하면 언제든지unsigned char한 조각씩을 가지고 있으면, 당신은 한다.

unsigned char c = (unsigned char)-1;

그것은 또한 변환이 단지 고차 비트를 잘라내는 것이 아니라는 것을 따른다.사람의 보어에게 다행스러운 일은 그것이 단지 그곳의 잘린 부분일 뿐, 다른 수화 표현에도 반드시 같은 것은 아니라는 점이다.

만약 당신이 다양한 종류의 특정한 길이와 서명을 사용하는 것을 좋아한다면, 당신은 아마도 더 잘 살 것이다.uint8_t int8_t uint16_t, 등 단순히 그들이 말하는 것을 정확히 하기 때문이다.

signed char범위가 -127인 경우unsigned char0 ~ 255의 범위를 가지고 있다.

char컴파일러에 따라 서명된 char 또는 서명되지 않은 char와 동일하지만, 구별되는 유형이다.

C 스타일 문자열을 사용하는 경우char) 휴대성을 되지 않은 문자를 계산에 문자를 사용해야 하는 경우(매우 드물지만) 휴대성을 위해 서명 또는 서명되지 않은 문자를 명시적으로 지정하십시오.

unsigned char양의 값만 있으면...0255 정도로

로서

signed char양의 값과 음의 값을 모두 취한다...+++++++++++처럼

unsigned char모든 속임수의 핵심이야모든 플랫폼의 거의 모든 컴파일러에서 aunsigned char단순히 바이트와 8비트의 부호 없는 정수로서, 작은 정수나 비트 팩으로 취급될 수 있다.

게다가, 다른 사람이 말했듯이, 표준은 카의 기호를 정의하지 않는다.그래서 너는 3개의 구별이 있다.char유형:char signed char unsigned char.

char그리고unsigned char모든 플랫폼에서 8비트 유형이 보장되는 것은 아니며, 8비트 이상도 보장된다.일부 플랫폼은 9비트, 32비트 또는 64비트 바이트를 가지고 있다.그러나 오늘날 가장 일반적인 플랫폼(Windows, Mac, Linux x86 등)은 8비트 바이트를 가지고 있다.

직접값의 경우 정규문자는 값이 다음 값 사이에 있는 것으로 알려져 있을 때 사용된다.CHAR_MIN그리고CHAR_MAX서명되지 않은 문자는 양극 끝의 두 배 범위를 제공한다.예를 들어, 다음과 같다.CHAR_BIT정규의 범위인 8이다.char[0,127]만 보장된다(서명 또는 미서명이 가능하기 때문에).unsigned char[0, 255]가 될 것이며signed char[-117]이 될 것이다.

용도에 있어서, 이 표준은 POD(구식 데이터)의 객체를 서명되지 않은 문자의 배열로 직접 변환할 수 있도록 허용한다.이를 통해 객체의 표현과 비트 패턴을 살펴볼 수 있다.차르나 서명된 차르에 대해 동일한 유형의 펀칭은 존재하지 않는다.

서명되지 않은 문자는 일반 문자의 기호를 위해 예약된 비트를 다른 숫자로 사용한다.이 경우 범위가 [-128 - 127]과 반대로 [0 - 255]로 변경된다.

일반적으로 서명되지 않은 문자는 부호를 원하지 않을 때 사용된다.이것은 비트를 이동할 때(시프트는 기호를 확장한다)와 같은 것들과 그것을 숫자로 사용하기 보다는 바이트로 다룰 때 다른 것들을 할 것이다.

어떤 구글링들은 이것에 대해 토론하는 곳에서 이것을 발견했다.

서명되지 않은 문자는 기본적으로 단일 바이트다.따라서 1바이트의 데이터가 필요한 경우(예: Windows API에서 흔히 하는 것처럼 플래그를 설정하거나 해제하여 함수에 전달하려는 경우) 이 옵션을 사용하십시오.

c프로그래밍 웃음(programming laughage) 책에서 인용한 말이다.

.signed또는unsigned수 있다.char는 수 있다. 가 없는 서명되지 않은 숫자는 항상 양수 또는 0이며, 산술모듈로 2^n의 법칙을 준수한다. 여기서 n은 유형 내 비트의 수입니다.따라서 예를 들어, 문자가 8비트인 경우 서명되지 않은 문자 변수는 0에서 255 사이의 값을 갖는 반면 서명된 문자 변수는 -128에서 127 사이의 값을 가진다.일반 문자가 서명되었는지, 서명되지 않았는지 여부는 기계에 따라 다르지만 인쇄 가능한 문자는 항상 양수적이다.

signed char그리고unsigned char둘 다 1바이트를 나타내지만 서로 다른 범위를 가지고 있다.

   Type        |      range
-------------------------------
signed char    |  -128 to +127
unsigned char  |     0 to 255

signed char고려한다면char letter = 'A', 'A'는 65in의 이진수를 나타낸다.ASCII/Unicode, 65를 저장할 수 있으면 -65도 저장할 수 있다..ASCII/Unicode부정적인 가치에 대해 걱정할 필요가 없다.

#include <stdio.h>

int main()
{
    signed char char1 = 255;
    signed char char2 = -128;
    unsigned char char3 = 255;
    unsigned char char4 = -128;

    printf("Signed char(255) : %d\n",char1);
    printf("Unsigned char(255) : %d\n",char3);

    printf("\nSigned char(-128) : %d\n",char2);
    printf("Unsigned char(-128) : %d\n",char4);

    return 0;
}

출력 -:

Signed char(255) : -1
Unsigned char(255) : 255

Signed char(-128) : -128
Unsigned char(-128) : 128

unsigned char 값:0 ~ , 수표: 0 ~ 255인승.signed char양수 및 음수 값 사용: -수치에서 +수치까지.

참조URL: https://stackoverflow.com/questions/75191/what-is-an-unsigned-char

반응형