2013-07-31 8 views
0

Stroustrup의 책 "The C++ Programming Language 4th edition"을 읽었으며 오버플로 과제 (특히 서명/서명되지 않은 문자에 대한 세 가지 질문이 있습니다. 먼저, 표준 5/4 항에있어서, 식의 평가 동안, 결과가없는 경우부호가있는 부호없는 지정 및 그 결과의 오버플로

수학적 여부 그 유형에 표현할 수있는 값의 범위에 정의 동작이 정의되지 .

(대상 변수가 부호가없는 경우는 예외 -이 경우 결과가 명확하게 정의됩니다.) 그러나이 정의는 또한 과제와 관련이 있습니까? 내 의견으로는 모든 장 첫 번째는 상기 문단에 해당하는 6에서 책의 많은 반대 문이 있기 때문에

그러나 다음과 같은 코멘트를하지 않습니다 : 세 char

변수 유형은 각 기타에 자유롭게 지정할 수 있습니다. 그러나 signed char에 너무 큰 값을 지정하면 여전히 이 정의되지 않습니다. 예를 들어 :

void g(char c, signed char sc, unsigned char uc) 
{ 
    c = 255; //implementation-defined if plain chars are signed and have 8 bits 
    c = sc; //OK 
    c = uc; //implementation-defined if plain chars are signed and if uc's value is too large 
    sc = uc; //implementation-defined if uc's value is too large 
    uc = sc; //OK: conversion to unsigned 
    sc = c; //implementation-defined if plain chars are unsigned and if c's value is too large 
    uc = c; //OK: conversion to unsigned 
} 

첫 번째 질문 : 너무 큰 값을 할당하기 때문에 UB, 의견을 말할 왜 그것을 구현 정의되어 있습니까?

signed char sc = -160; 
unsigned char uc = sc; //uc == 116 (because 256-160==116) 
cout << uc; //print 't' 

두 번째 질문 :하십시오 char가 8 비트라고 가정,

이 구체적으로 :

다음으로 우리는 다음과 같은 예를 따로 사실에서 먼저 할당은 아마도 UB일까요, 저자가 116을 산출하기 위해 사용한 공식은 정확히 무엇입니까?

정수가 또 다른 정수 형식으로 변환 할 수 있습니다 내 테스트에서, uc는 96

의 가치와 마지막 견적을 얻었다. 대상이 signed 인 경우 대상 유형에 이 표시 될 수 있으면 값이 변경되지 않습니다.

signed char sc = 1023; //implementation-defined

개연성 결과 (127) -1이다 : 그렇지 않으면, 값 구현 정의이다.

세 번째 질문 : 다시 떨어져 사실에서 이전 UB에 대해 말한 것을이 반대, 왜 가능한 결과 127 -1 것을? 나는 그것이 하나의 2의 보완과 관련이 있다고 생각하지만 정확한 수식은 무엇인가?

+0

위의 내용을 PDF 버전에서 확인하려면 위의 텍스트를 제공하십시오. – SChepurin

+0

@SChepurin 제 6 장입니다. – Quentin

+0

섹션 번호? 나는 그 책이 제 3 판에서 극적으로 변했다고 믿지 않는다. 6은 * 표현식과 문장 *입니다. – SChepurin

답변

0

1) 정의 된 구현은 "UB 클래스"입니다. 즉, 여전히 UB입니다. 구현이 작동 방식을 설명 할 책임이 있습니다. "이 작업에 전혀 의존 할 수 없습니다 ". 따라서 범위를 벗어난 char 값을 지정하면 컴파일러는 컴퓨터를 폭발시킬 수 있습니다. 그러나 구현은 또한 "8 비트 동치 값으로 잘라냅니다"라고 정의 할 수 있습니다.

2) 내 계산기의 256 - 160 = 96. 나는 그것이 너뿐 인 것 같아. 아마 저자가 다른 계산기를 가지고 있었을까요? 아니면 마지막 순간에 -150에서 -160으로 변경된 것 중 하나입니다. 최종 결과를 변경하는 것을 잊었습니다.

3) "구현 정의"이므로 거의 모든 것이 될 수 있습니다. 값은 16 진수의 0x3ff이므로, 구현 방법에 따라 0xff 또는 0x7f를 가능한 값으로 상상할 수 있습니다. 나는 MOST 컴파일러가 0xff 값을 사용할 것으로 기대한다.

+0

2) 좋아,하지만 왜 256에서 빼는거야? 3) 0x7f가 필요한 이유는 무엇입니까? – Quentin

+1

2) 그 이유는 숫자를 "잘라내는"일이 일어나기 때문입니다. 3) 이것은 "유형이 가질 수있는 최대 양수"입니다. 즉, 서명 된 값의 부호를 변경하지 않으면 얻는 값입니다. 이것은 "너무 큰 값"에 대한 합리적인 반응이라고 생각할 수 있으며, "-1"을 얻는 것만큼이나 ... "모두 허용 된"것입니다. 124 또는 75 일 가능성은 낮지 만, 기술적으로 구현자가 문서화 된 방식으로 문서화하기로 결정한 경우에도 유효합니다. –