부호없는 정수는 모듈로 산술을 보장합니다.따라서 어떤 int
값 V가 unsigned long
값으로 변환된다 유 는 U는 K 2 N K는 + V, 0 또는 1이고, N는 예이다 * = 것을 unsigned long
에 대한 값 표현 비트의 수. 즉, v이 음수이면 2 n을 추가하십시오.
2의 거듭 제곱은 정수가 순수한 이진 시스템으로 표현된다는 C++ 표준의 요구 사항을 따릅니다. n 값 표현 비트로 가능한 값의 수는 2 n입니다. 부동 소수점 유형에 대한 요구 사항은 없습니다 (std::numeric_limits
을 사용하여 부동 소수점 값 표현의 기수를 확인할 수 있음).
는 또한 위해 몇 가지 지금 오래된 플랫폼에 맞는뿐만 아니라 일을 자신의 방법을 수행 한 인기 컴파일러에주의 서명되지 않은 값을 직접 표현할 수없는 경우, 표준은 정의되지 않은 동작과 반대의 변환을 잎 서명 된 값으로. 실제로 현대 시스템에서는 모든 컴파일러가 역 변환을 부호없는 유형으로의 변환과 정반대로 수행하라는 지시를받을 수 있습니다. Visual C++에서는 기본적으로이 작업을 수행합니다. 그러나 공식적인 지원이 없다는 점을 명심해야합니다. 따라서 이식 가능한 코드는 약간의 (현재는 불필요한 컴퓨터로) 비효율적입니다.
서명 확장처럼 보입니다. https://en.wikipedia.org/wiki/Sign_extension 그래서 아마도 예 – OSborn
두 가지 가능성이 있습니다 : 1) 'long long'으로 변환 된 다음 'unsigned long long'으로 변환; 2) 'unsigned'로 변환하고 'unsigned long long'으로 변환합니다. 표준의 서한이 우선하는 것이 명백하지 않습니다. – user12
@ user12 : 그것이 완료된 방식은 두 가지 가능성 중 하나가 아니며 'int'에서 'unsigned long long'으로 변환하는 방향입니다. 후자가 더 큰 경우 (일반적으로) 부호가있는 정수 값의 2의 보수 표시가있는 일반 시스템에서 부호 확장이 수행됩니다. 부호 확장은 가장 중요한 비트 (부호 비트)를 단순히 복제하여 왼쪽으로 채 웁니다. –