2010-03-26 2 views
10

char가 서명되었거나 서명되지 않은 경우 C가 정의되지 않았으며 GCC 페이지에서는 PowerPPC 및 ARM에서 x86 및 unsigned로 서명 할 수 있다고 나와 있습니다.Char C 질문에 대한 서명/서명이 없음

Okey, char를 gchar으로 정의하는 GLIB를 작성하고 있습니다 (표준화를위한 유일한 방법은 아닙니다).

제 질문은 UTF-8은 무엇입니까? 그것은 한 블록 이상의 메모리를 사용합니까?

내가 = "UTF8의 enconding 나의 문자열 ~> CA"변수

서명 숯불에 * 문자열을 가지고 말;

참조, 내 변수를 선언하는 경우 등

부호

난 단지 127 (그래서 내 프로그램 MEM의 더 많은 블록을 저장하는 것) 값 또는 UTF-8이있을 것이다 부정으로도 바꿀까요?

죄송합니다. 정확하게 설명 할 수 없지만 조금 복잡하다고 생각합니다.

참고 : 모든 덕분에 내가 그것을 정상적으로 해석 방법을 이해하지 않습니다

대답합니다.

아스키처럼, 내 프로그램에 서명되고 서명되지 않은 문자가 있으면 문자열에 diferently 값이있어 혼동을 일으키며 utf8에서 상상할 수 있습니다.

+0

최신 기계를 사용하는 경우, unsigned char은 값 0..255를 지원합니다. 하지만 UTF-8은 멀티 바이트 인코딩입니다. 각 유니 코드 문자에 대해 1..4 바이트를 사용합니다. –

+0

나는 마이클 버가 말했다. – drigoSkalWalker

답변

1

실제로는 unsigned/signed은 변수에 저장할 수있는 값의 수를 지정하지 않습니다. 그것은 그들이 어떻게 해석됩니다 지정합니다.

그러므로 unsigned char은 음수를 가지며 다른 숫자는 그렇지 않다는 것을 제외하고는 signed char과 동일한 양의 값을가집니다. 그것은 여전히 ​​8 비트입니다 (만약 우리가 char이 8 비트를 가지고 있다고 가정한다면, 그것이 모든 곳에서 확실하지는 않습니다).

+1

표준 C는 문자가 적어도 8 비트를 유지하도록 보장합니다. 9 비트 또는 10 비트 문자 기계가 거의 남아 있지 않습니다. –

2

부호가있는/부호없는 것은 산술 연산에만 영향을줍니다. char가 부호없는 경우 높은 값은 양수입니다. 서명 한 경우에는 부정적입니다. 그러나 범위는 여전히 동일합니다.

1

char *를 문자열로 사용할 때 차이점이 없습니다. 부호있는/서명되지 않은 유일한 시간은 산술이나 숫자처럼 정수로 해석하는 경우와 같이 숫자를 해석하는 경우 차이가 날 것입니다.

+2

문자를 비교하는 경우에도 차이가 발생할 수 있습니다. 예를 들어, UTF8의 경우'flag '문자는 일반적으로'char'가 서명 된 경우 음수입니다. 코드가 준비되지 않았다면 문제가 발생합니다. –

+0

좀 더 설명해 주시겠습니까? – drigoSkalWalker

+0

@Michael Burr 몰랐습니다. 참고 자료가 있습니까? –

0

UTF-8 문자는 1 바이트로 저장 될 수 없습니다. UTF-8 문자는 1-4 바이트 너비 일 수 있습니다. 따라서 char, wchar_t, signed 또는 unsigned은 한 단위가 항상 하나의 UTF-8 문자를 저장할 수 있다고 가정하기에 충분하지 않습니다.

대부분의 플랫폼 (예 : PHP, .NET 등)은 문자열을 일반적으로 (예 : C에서 char[]) 빌드하고 라이브러리를 사용하여 문자열에서 인코딩 및 구문 분석 문자를 변환합니다.

+0

네, 문자의 배열이 필요합니다 분명하지만, 내 질문에 대한 서명 및 서명되지 않은, 만약 내가 노래 또는 서명되지 않은 배열의 문자가 내 프로그램을 잘못 실행할 수 있습니다 생각해? – drigoSkalWalker

+0

다른 답변은 signed/unsigned가 저장되는 데이터의 크기를 변경하지 않는다는 점에서 정확합니다. UTF-8은 한자, 아랍어 등의 UTF-8 문자에 대해 1 바이트 이상일 수 있다는 것에 관심이 많았습니다. – spoulson

6

나는 내가 한 의견을 설명하기 위해 몇 가지 요청을했습니다.

char 유형이 부호가 있거나 부호없는 유형으로 기본 설정 될 수 있다는 사실은 문자를 비교하고 특정 순서가 필요할 때 중요 할 수 있습니다. 특히 UTF8은 높은 비트를 사용합니다 (대부분의 플랫폼에서 char이 8 비트 유형이라고 가정하면 문자 코드 포인트에 두 개 이상의 바이트가 표시되어야 함을 나타냄).

문제의 신속하고 더러운 예 : I에서, 꾸밈 char 유형은 일반적으로 우리가 명시 적으로 unsigned char 지정하는 형식 정의를 사용하여 유리하게 피할 작동 대부분의 프로젝트에

#include <stdio.h> 
int main(void) 
{ 
    signed char flag = 0xf0; 
    unsigned char uflag = 0xf0; 

    if (flag < (signed char) 'z') { 
     printf("flag is smaller than 'z'\n"); 
    } 
    else { 
     printf("flag is larger than 'z'\n"); 
    }  


    if (uflag < (unsigned char) 'z') { 
     printf("uflag is smaller than 'z'\n"); 
    } 
    else { 
     printf("uflag is larger than 'z'\n"); 
    } 
    return 0; 
} 

. 일반적으로 unsigned char 유형을 다루는 stdint.h 또는

typedef unsigned char u8; 

에서 uint8_t 같은 무언가가 잘 작동하고 몇 가지 문제가있는 것 - 나는 가끔 문제를 본 적이 한 지역은 루프를 제어하기 위해 해당 유형의 무언가를 사용하는 경우 :

while (uchar_var-- >= 0) { 
    // infinite loop... 
} 
3

두 가지 :

숯불 유형 서명 또는 서명한다
  1. 여부는하지 않습니다 UTF8로 인코딩 된 문자열을 사용중인 모든 표시 문자열 유형 (WCHAR 또는 기타 등등)으로 변환하는 능력에 영향을줍니다. 다른 말로하면 UTF8 바이트는 바이트 일 뿐이며 인코더/디코더로 사용하는 것은 무엇이든 올바르게 수행 할 것입니다.

  2. 당신의 혼란의 일부는이 작업을 수행하기 위해 노력하고 있다고 할 수있다 : 당신이 다른 개념을 혼합하고이 항아리

    unsigned char *string = "This is a UTF8 string"; 
    

    은하지 마십시오. UTF-8로 인코딩 된 문자열은 바이트 시퀀스입니다. C 문자열 리터럴 (위와 같음)은 이것을 나타 내기 위해 실제로 설계되지 않았습니다. 그들은 "ASCII로 인코딩 된"문자열을 표현하도록 설계되었습니다. 일부 경우 (여기의 광산과 같은)의 경우에도 똑같은 결과를 낳습니다. 문제의 예에서 그렇다고해서 그렇지 않을 수도 있습니다. 그리고 확실히 다른 경우에는 그렇지 않을 것입니다. 외부 리소스에서 유니 코드 문자열을로드하십시오. 일반적으로 .c 소스 파일에 비 ASCII 문자를 포함하는 것에주의해야합니다. 컴파일러가 그들과 함께 무엇을해야하는지 알지라도 툴체인의 다른 소프트웨어는 그렇지 않을 수도 있습니다.

5

unsigned char 사용에는 장단점이 있습니다. 가장 큰 이점은 부호 확장이나 서명 된 오버플로와 같은 예상치 못한 결과를 산출하는 재미있는 기능을 얻지 못한다는 것입니다. 부호없는 char은 <cctype> isalpha (ch)와 같은 매크로/함수와도 호환됩니다 (이 모든 값은 부호없는 char 범위의 값을 필요로합니다). 반면에 모든 I/O 함수에는 char *가 필요하므로 I/O를 수행 할 때마다 캐스팅해야합니다.

UTF-8의 경우 부호가 있거나 부호가없는 배열에 저장하는 것이 좋지만 유효한 UTF-8이라는 보장이 거의 없으므로이 문자열 리터럴에주의해야합니다. C++ 0x는 가능한 문제를 피하기 위해 UTF-8 문자열 리터럴을 추가했으며 다음 C 표준에서도 이러한 문제를 수용 할 것으로 기대합니다.

일반적으로 소스 코드 파일이 항상 UTF-8로 인코딩되어 있는지 확인하는 것이 좋습니다.you'r 질문에 관해서는

0

: 나는 내 프로그램 실행이 잘못 할 수있는 문자의 불똥이 튄 또는 부호 ARRAY이있는 경우

생각? - drigoSkalWalker

예. 예. 내 것이했다. 평범한 서명 된 문자를 사용한다면 내 앱에서 간단한 실행 파일 발췌 부분이 완전히 나옵니다. 모든 문자를 부호없는 매개 변수로 변경 한 후 실행 해보십시오. 이렇게 :

int is_valid (부호 없음 char c);

그러면 정상적으로 작동합니다.

#include <stdio.h> 

int is_valid(char c); 

int main() { 

    char ch = 0xFE; 
    int ans = is_valid(ch); 
    printf("%d", ans); 

} 

int is_valid(char c) { 
    if((c == 0xFF) || (c == 0xFE)) { 
    printf("NOT valid\n"); 
     return 0; 
    } 
    else { 
     printf("valid\n") 
     return 1; 
    } 
} 

char이 utf-8 내의 유효한 바이트인지 확인합니다. 0xFF 및 0xFE는 utf-8에서 유효하지 않은 바이트입니다. 함수가 유효한 바이트로 유효성을 검사하면 문제가 상상해보십시오. 당신이 (서명이)가 일반 문자에서 가장 왼쪽 비트, 최상위 비트를이 저장하면

0xFE 
= 
11111110 
= 
254 

, 음수 수 :

은 무슨 일이 있습니다. 그러나 음수는 무엇입니까?

비트를 뒤집고 한 비트를 추가하면됩니다.

11111110 
00000001 
00000001 + 00000001 = 
00000010 = 2 

그리고 그것은 음이 기억된다 그래서 -2

너무 (-2 == 0xFE로)를 함수에 당연히 밤은 참. 같음 (-2 == 0xFF).

따라서 유효하지 않은 바이트를 확인하는 함수는 마치 유효하지 않은 바이트를 확인하는 것처럼 끝납니다. -o. 내가 UTF-8을 처리 할 때 부호에 충실하는 생각할 수

다른 두 가지 이유가 있습니다 : 당신이 오른쪽으로 약간 bitshifting을해야 할 수 있습니다 당신이 끝날 수 있기 때문에

  1. 는 문제가있을 수 있습니다 서명 된 문자를 사용하는 경우 왼쪽에서 1을 더합니다.

  2. utf-8 및 유니 코드는 양수를 사용하기 때문에 ... 왜 당신도 그러지 않습니까? 간단한 유지 :