2014-03-02 2 views
4

int 값이 표준에서 unsigned long long으로 변환되는 정확한 사양을 찾을 수 없습니다. int와 같은 다양한 유사한 전환이 -> 부호, 부호 -> INT (UB 음의 경우), 부호 길이 긴 - 등> INT는, 예를 들면 GCC 들어 표준 변환에 의한 int -> unsigned long long

지정되어 -1은하지 0x00000000ffffffff0xffffffffffffffff로 변환된다. 이 행동에 의지 할 수 있습니까?

+0

서명 확장처럼 보입니다. https://en.wikipedia.org/wiki/Sign_extension 그래서 아마도 예 – OSborn

+0

두 가지 가능성이 있습니다 : 1) 'long long'으로 변환 된 다음 'unsigned long long'으로 변환; 2) 'unsigned'로 변환하고 'unsigned long long'으로 변환합니다. 표준의 서한이 우선하는 것이 명백하지 않습니다. – user12

+0

@ user12 : 그것이 완료된 방식은 두 가지 가능성 중 하나가 아니며 'int'에서 'unsigned long long'으로 변환하는 방향입니다. 후자가 더 큰 경우 (일반적으로) 부호가있는 정수 값의 2의 보수 표시가있는 일반 시스템에서 부호 확장이 수행됩니다. 부호 확장은 가장 중요한 비트 (부호 비트)를 단순히 복제하여 왼쪽으로 채 웁니다. –

답변

2

예, 이것은 기본적으로 max unsigned long long + 1-1을 추가합니다. 항상 이됩니다. 대상 유형이 서명되지

되면 결과 값은 N이 소스 정수 합동 최소 부호없는 정수 (모듈 2 N이다 : 이것은 draft C++ standard 섹션 말한다 4.7적분 전환 덮여 부호 없음 형을 나타 내기 위해서 (때문에) 사용되는 비트 수). [주 : 2의 보수 표현에서이 변환은 개념적이며 비트 패턴에는 변경 사항이 없습니다 (절단이 없으면). -end 노트]

는 C99과 같은 일을하지만 draft C99 standard 섹션 6.3.1.3서명에서 이해하기 쉬우 며 부호없는 정수 :

그렇지 않으면, 새로운 유형의 서명되지 않은 경우, 값은 새 유형의 범위에 속할 때까지 을 새 유형 에 표시 할 수있는 최대 값보다 하나 더 뺀 값을 반복하여 추가하여 변환됩니다. 49)

각주 49 말한다 여기서

규칙은 상기 수학 식의 값에 소정의 형태가 아닌 값을 연산을 설명한다.

1

예, 정의있다 : 목적지 유형 부호이다

되면 결과 값은 하나의 부호없는 정수이다 :

C++ 11 §는 4.7 [conv.integral/2이 말한다 소스 정수 (modulo 2 n, 여기서 n은 부호없는 유형을 나타내는 데 사용되는 비트 수)와 일치합니다.

-1 (모듈로 2 sizeof(unsigned long long)) 합동 최소 부호 정수 가능 unsigned long long의 최대 값이다.

1

부호없는 정수는 모듈로 산술을 보장합니다.따라서 어떤 intVunsigned 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++에서는 기본적으로이 작업을 수행합니다. 그러나 공식적인 지원이 없다는 점을 명심해야합니다. 따라서 이식 가능한 코드는 약간의 (현재는 불필요한 컴퓨터로) 비효율적입니다.

+0

'k'는'unsigned '값이 더 작 으면 이론적으로 0 또는 1 이외의 값이 될 수 있지만'long'과'long long'은'int'보다 작아지지 않습니다. 옆으로, 나는 무언가가 변경되었거나 최근에 여기에'int'보다 int 형이 더 명확 해 졌다고 맹세했다. ... – Yakk

+0

@Yakk : 예, 다른 유형이 포함되면 다른 (완전한) K 값을 가질 수있다. 명확히해라, 나는 그것이 나다라고 생각하지 않는다. 나는 몇 년 전에 누군가가 빌트인 타입을위한 범위에 대해 물어 보았고 나는 그것들을 C 표준으로 언급했다. 그것은 C 표준의 어떤 것이라도 C++에 적용될 수 있다고 믿지 않기로 한 아이의 진노를 초래했습니다. 또는 어쩌면 그/그들은 내가 관련 구절을 찾아내어 인용 할 수있는 발판을 마련하기를 원했습니다. 그 또는 그녀는 또한 2의 권한이 숫자 범위와 관련 될 수 있다고 믿지 않았습니다. 그것은 일종의 불쾌한 일이었습니다. –

+0

내 생각 엔 C/C++에서 정수형이 최근에 수정 된 int 또는 long보다 큰 버그가 있다고 생각합니다. (예 : C++ 11 등) – Yakk

관련 문제