prosource

차에 서명한다는 것은 어떤 의미입니까?

probook 2023. 9. 20. 20:23
반응형

차에 서명한다는 것은 어떤 의미입니까?

서명된 인트와 서명되지 않은 인트는 동일한 레지스터 등을 사용하고 비트 패턴만 다르게 해석할 뿐이고, C 문자는 기본적으로 8비트 인트에 불과하다는 것을 감안하면 C에서 서명된 문자와 서명되지 않은 문자의 차이점은 무엇입니까?저는 촤의 서명성이 구현에 정의되어 있다는 것을 이해합니다. 그리고 적어도 촤가 수학 대신 끈을 잡는 데 사용될 때 그것이 어떻게 변화를 가져올 수 있는지 이해할 수 없습니다.

끈에는 아무런 차이가 없을 겁니다.하지만 C에서 당신은 수학을 할 때 차를 사용할 수 있습니다. 언제 그것이 변화를 가져올지 말입니다.

사실, 내장된 8비트 응용프로그램과 같이 제한된 메모리 환경에서 작업할 때는 한 문자를 사용하여 수학을 수행하는 경우가 많습니다. 그런 다음 큰 차이를 만들어 냅니다.입니다.byte기본적으로 C로 입력합니다.

이들이 나타내는 가치는 다음과 같습니다.

부호 없는 char:

  • 있습니다.0..255 (00000000..11111111)
  • 낮은 에지 주변에 오버플로되는 값:

    0 - 1 = 255 (00000000 - 00000001 = 11111111)

  • 값이 하이 에지 주변에 오버플로됨:

    255 + 1 = 0 (11111111 + 00000001 = 00000000)

  • 비트 (>>)에서 논리적 이동을 수행합니다.

    10000000 >> 1 = 01000000 (128 / 2 = 64)

서명된 char:

  • 있습니다.-128..127 (10000000..01111111)
  • 낮은 에지 주변에 오버플로되는 값:

    -128 - 1 = 127 (10000000 - 00000001 = 01111111)

  • 값이 하이 에지 주변에 오버플로됨:

    127 + 1 = -128 (01111111 + 00000001 = 10000000)

  • 비트 (>>에서 산술 합니다를 합니다.

    10000000 >> 1 = 11000000 (-128 / 2 = -64)

값 래핑 동작이 순수하고 일관된 이진 산술이며 문자가 서명/부호되는 것과는 아무런 관련이 없음을 보여주기 위해 이진 표현을 포함시켰습니다(오른쪽 시프트 예상).

갱신하다

코멘트에 언급된 몇 가지 구현별 동작:

#include <stdio.h>

int main(int argc, char** argv)
{
    char a = 'A';
    char b = 0xFF;
    signed char sa = 'A';
    signed char sb = 0xFF;
    unsigned char ua = 'A';
    unsigned char ub = 0xFF;
    printf("a > b: %s\n", a > b ? "true" : "false");
    printf("sa > sb: %s\n", sa > sb ? "true" : "false");
    printf("ua > ub: %s\n", ua > ub ? "true" : "false");
    return 0;
}


[root]# ./a.out
a > b: true
sa > sb: true
ua > ub: false

줄을 정렬할 때 중요합니다.

몇 가지 차이점이 있습니다.가장 중요한 것은 너무 크거나 작은 정수를 할당하여 유효 범위를 넘치게 하고 char가 서명된 경우, 모든 서명된 유형과 마찬가지로 결과 값이 구현에 정의되거나 심지어 일부 신호(C)가 상승할 수 있다는 것입니다.서명되지 않은 문자에 너무 크거나 작은 것을 할당하는 경우와 대조해 보십시오. 값은 둘러싸입니다. 정확하게 정의된 의미론을 얻을 수 있습니다.예를 들어 부호가 없는 char에 -1을 할당하면 UCHAR_MAX를 얻을 수 있습니다. 따라서 0에서 2^CHAR_B 사이의 숫자와 같은 바이트를 가질 때마다IT, 서명되지 않은 차를 사용하여 보관해야 합니다.

이 기호는 또한 다음과 같은 barrag 함수로 전달될 때 차이를 만듭니다.

char c = getSomeCharacter(); // returns 0..255
printf("%d\n", c);

c에 할당된 값이 char가 표현하기에는 너무 크며, 기계는 2의 보어를 사용한다고 가정합니다.많은 구현은 문자에 너무 큰 값을 할당하는 경우 비트 패턴이 변경되지 않는 경우에 대해 작동합니다.int가 대부분의 구현에서 사용되는 char의 모든 값을 나타낼 수 있는 경우 printf로 전달되기 전에 char가 int로 승격됩니다.따라서 통과된 값은 음수가 됩니다.홍보를 하는 것은 그 표시를 유지할 것입니다.그래서 당신은 부정적인 결과를 얻게 될 것입니다.그러나 char가 서명되지 않은 경우 값은 서명되지 않으며 int로 승격하면 양의 int가 됩니다.서명되지 않은 문자를 사용하면 변수에 대한 할당과 printf에 전달하여 긍정적인 것을 인쇄할 수 있습니다.

문자, 서명되지 않은 문자, 서명된 문자의 너비는 모두 최소 8비트입니다.char가 정확히 8비트 너비일 필요는 없습니다.그러나 대부분의 시스템에서는 사실이지만 일부 시스템에서는 32비트 문자를 사용합니다.C와 C++의 바이트는 char의 크기를 갖는 것으로 정의되므로, C의 바이트 또한 항상 정확히 8비트인 것은 아닙니다.

또 다른 차이점은 C에서 부호가 없는 문자는 패딩 비트가 없어야 한다는 것입니다.즉, CHAR_B를 찾으면IT는 8이고, 부호가 없는 문자의 값은 0 ... 2^CHAR_BIT-1의 범위여야 합니다.서명이 없는 경우에도 마찬가지입니다.부호화된 char의 경우 값의 범위에 대해 아무것도 가정할 수 없습니다. 컴파일러가 부호화를 구현하는 방법(둘의 보어 또는 다른 옵션)을 알고 있더라도 사용되지 않은 패딩 비트가 있을 수 있습니다.C++에서는 세 가지 문자 유형 모두 패딩 비트가 없습니다.

"차에 서명한다는 것은 무슨 뜻입니까?"

전통적으로 ASCII 문자 집합은 7비트 문자 인코딩으로 구성됩니다.(8비트 EBCIDIC와는 반대로)

(시리얼 모뎀 장치를 통한 데이터 전송 등 여러 가지 이유로) C 언어를 설계하고 구현할 때 큰 문제가 있었습니다.여분의 비트에는 패리티와 같은 용도가 있습니다.

마침 이 표현에는 "서명된 문자"가 적합합니다.

이진 데이터인 OTOH는 단순히 데이터의 각 8비트 "청크" 값을 취하는 것이므로 부호가 필요하지 않습니다.

바이트에 대한 산술은 컴퓨터 그래픽에 중요합니다(여기서 색상을 저장하는 데 8비트 값이 자주 사용됨).그 외에도, 저는 문자 표시가 중요한 두 가지 주요한 경우를 생각할 수 있습니다.

  • 더 큰 int로 변환하기
  • 비교 함수

더 나쁜 것은 이것들이 당신의 모든 문자열 데이터가 7비트라면 당신을 물지 않을 것이라는 것입니다.그러나 C/C++ 프로그램 8비트를 깨끗하게 하려고 한다면, 그것은 잘 알려지지 않은 버그의 끝없는 원천이 될 것을 약속합니다.

은 합니다에서도 합니다.chars는 다른 적분형에서 하는 것과 같습니다.말씀하신 것처럼, 문자는 정말로 1바이트의 정수일 뿐입니다. (하지만8비트는 아닙니다!차이점이 있습니다. 일부 플랫폼에서는 바이트가 8비트보다 클 수 있습니다.char는 s 는의 .char그리고.sizeof(char).CHAR_BIT로에 ,,<limits.h>는 C++<climits>, 한 번에 몇 개의 비트가 있는지 알려줄 것입니다.char.).

에 는 C C++ 라는 byte . 에게,chars는 바이트이고, 그 반대도 마찬가지이며, 그것들을 구별하지는 않습니다.하지만 때로는 그렇게 하고 싶을 도 있죠char일반적으로 1바이트 숫자가 될 수 있으며, 그러한 경우(특히 바이트가 가질 수 있는 범위가 얼마나 작은지), 숫자가 서명되었는지 여부도 관심을 가질 수 있습니다.인호)을 을 char는 문자가 아닌 (numeric) "바이트"이며 숫자로 사용될 것입니다. 그면은char 것입니다 really이며,입니다.

저는 오히려 그렇게 하곤 했어요.의 제 C와 C++를 갖습니다.(u?)int_least8_t(현재는 def를 입력했습니다.) 입력했습니다.<stdint.h>아니면<cstdint>및(이지만)에 이지만), .char유형(어쨌든.

내가 이것이 문제가 될 것이라고 상상할 수 있는 유일한 상황은 당신이 차에 대해 수학을 하기로 선택하는 경우입니다.아래의 코드를 작성하는 것은 완전히 합법적입니다.

char a = (char)42;
char b = (char)120;
char c = a + b;

char의 부호성에 따라 c는 두 개의 값 중 하나가 될 수 있습니다.char가 부호가 없는 경우 c는 (char)162가 됩니다.서명된 문자의 최대값이 128이므로 서명된 문자의 경우 오버플로 케이스가 됩니다.대부분의 구현은 그냥 (char)-32로 돌아올 것입니다.

서명된 문자의 한 가지는 c > = ' ' ' (공백)을 테스트할 수 있으며 정상적인 인쇄 가능한 아스키 문자인지 확인할 수 있다는 것입니다.물론 휴대성이 좋지 않아서 유용하지는 않습니다.

언급URL : https://stackoverflow.com/questions/451375/what-does-it-mean-for-a-char-to-be-signed

반응형