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의 보완과 관련이 있다고 생각하지만 정확한 수식은 무엇인가?
위의 내용을 PDF 버전에서 확인하려면 위의 텍스트를 제공하십시오. – SChepurin
@SChepurin 제 6 장입니다. – Quentin
섹션 번호? 나는 그 책이 제 3 판에서 극적으로 변했다고 믿지 않는다. 6은 * 표현식과 문장 *입니다. – SChepurin