C: 부호 없는 피연산자에 대한 일항 빼기 연산자 동작
부호 없는 피연산자가 있는 단항 빼기 연산자의 동작을 완전히 정의하는 C 표준의 관련 부분을 찾을 수 없는 것 같습니다.
C C은 5 2003에 있습니다. C++ (네, C++, 몇은참고에줄표만다준말니합같년이다음서과은) 5.3.1c7에 나와 .The negative of an unsigned quantity is computed by subtracting its value from 2^n, where n is the number of bits in the promoted operand.
그러나 1999 C 표준은 그러한 명시적인 진술을 포함하지 않으며 6.5.3.3c1,3 또는 6.5c4에서 단항 행동을 명확하게 정의하지 않습니다.후자에는 다음과 같이 쓰여 있습니다.Some operators (the unary operator ~, and the binary operators <<, >>, &, ^, and |, ...) ... return values that depend on the internal representations of integers, and have implementation-defined and undefined aspects for signed types.)
그것은 단항 마이너스를 제외하고 사물들은 모호하게 남아 있는 것처럼 보입니다.
이 앞의 질문은 K&R ANSI C 책, 섹션 A.7.4.5에 관한 것입니다.The negative of an unsigned quantity is computed by subtracting the promoted value from the largest value of the promoted type and adding one
.
책에서 위의 인용문과 동등한 1999 C 표준은 무엇입니까?
6.2.5c9는 다음을 의미합니다.A computation involving unsigned operands can never overflow, because a result that cannot be represented by the resulting unsigned integer type is reduced modulo the number that is one greater than the largest value that can be represented by the resulting type.
그게 다야?아니면 제가 놓친 다른 것이 있나요?
예, 6.2.5c9가 정확히 당신이 찾던 단락입니다.
부호 없는 피연산자에서 단항 빼기 연산자의 동작은 기계가 부호 있는 숫자를 가진 2의 보완 산술을 사용하는지 여부와는 아무런 관련이 없습니다. 신에진, 주어대가 주어집니다.unsigned int x,y;
y=-x;
유할것의 원인이 될 입니다.y
어떤 가치가 있어야만 하는 것을 받는 것.x+y
0과 같은한다면x
0은 0입니다.y
마찬가지로 0이 됩니다.에 대해서는x
것입니다, 그럴것이다다것.UINT_MAX-x+1
이경의산의 x+y
▁▁be 될 것입니다.UINT_MAX+1+(y-y)
하면 이당될것그그▁which때,될당할,▁a▁to.unsigned integer
을 가질 것입니다UINT_MAX+1
0을 뺀 값입니다.
제가 아는 모든 구현에서 음수는 2의 보어로 계산됩니다.
int a = 12;
int b = -a;
int c = ~a + 1;
assert(b == c);
...그러므로 음의 부호가 있는 정수와 "음의" 부호가 없는 정수 사이에는 물리적인 차이가 없습니다. 유일한 차이점은 그것들이 해석되는 방식입니다.
그래서 이 예에서는...
unsigned a = 12;
unsigned b = -a;
int c = -a;
...그b
그리고.c
정확히 같은 비트를 포함할 것입니다.유일한 차이점은b
2되는 반면, 2^32-12(2^64-12)는 로또는반해,c
는 "정상" -12"으로됩니다.
따라서 "부호성"에 관계없이 정확히 동일한 방식으로 음이 계산되며, 서명되지 않은 것과 서명된 것 사이의 캐스팅은 실제로는 작동하지 않습니다(일부 비트를 "차단"해야 한다는 의미에서 오버플로를 유발할 수 없습니다).
늦었지만 어쨌든...
C는 (이미 다른 답변에서 언급한 바와 같이 다소 어려운 방식으로) 다음과 같이 말합니다.
부호 없는 유형은 유형별 비트 수가 있는 이진 표현입니다.
부호 없는 유형에 대한 모든 산술 연산이 수행됩니다(mod 2^N). 'mod'는 계수의 수학적 정의이고 'N'은 유형을 나타내는 데 사용되는 비트 수입니다.
부호 없는 유형에 적용된 단항 빼기 연산자는 값이 다음으로 큰 부호 있는 유형으로 승격된 후 음수가 된 다음 다시 부호 없는 유형으로 변환되고 원본 유형으로 잘린 것처럼 동작합니다.('int'보다 비트 수가 적은 모든 유형에 대해 정수 프로모션이 발생하기 때문에 이것은 약간 단순하지만, 충분히 가깝다고 생각합니다.)
일부 컴파일러는 부호가 없는 유형에 단항 마이너스를 적용할 때 경고를 제공하지만, 이는 단지 프로그래머의 이익을 위한 것입니다.IMHO는 구조가 잘 정의되어 있고 휴대가 가능합니다.
하지만 확실하지 않다면, 단항 마이너스를 사용하지 마세요: '-x' 대신 '0u - x'를 쓰면 모든 것이 잘 될 것입니다.최적화가 완전히 비활성화되지 않는 한 괜찮은 코드 생성기는 이 명령에서 부정 명령만 생성합니다.
언급URL : https://stackoverflow.com/questions/8026694/c-unary-minus-operator-behavior-with-unsigned-operands
'programing' 카테고리의 다른 글
무엇이 C에서 더 나은 상수, 매크로 또는 열거를 만들 수 있습니까? (0) | 2023.06.17 |
---|---|
워드프레스:필터가 있는 보관 페이지가 작동하지 않음(ACF) (0) | 2023.06.12 |
마리아의 동적 피벗 열 이름에 공백이 있습니다.DB (0) | 2023.06.12 |
Firebase 호스팅에서 개인 환경 변수를 어떻게 설정합니까? (0) | 2023.06.12 |
SQL 덤프 파일에서 화살표를 통해 도커 내의 mysql 명령으로 입력을 전달할 수 없습니다. (0) | 2023.06.12 |