서명된 int와 서명되지 않은 int 사이의 캐스트는 메모리에서 변수의 정확한 비트 패턴을 유지합니까?
32비트 부호 정수를 전달하고 싶습니다.x
콘센트를 통하여수신자가 예상되는 바이트 순서를 알고자 전화를 걸었습니다.htonl(x)
보내기 전에htonl
기대합니다uint32_t
하지만, 그리고 내가 캐스팅할 때 무슨 일이 일어나는지 확실히 하고 싶습니다.int32_t
에 이르기까지uint32_t
.
int32_t x = something;
uint32_t u = (uint32_t) x;
항상 이런 경우가 있나요?x
그리고.u
각각은 완전히 똑같을 것입니까?다시 캐스팅하는 것은 어떻습니까?
uint32_t u = something;
int32_t x = (int32_t) u;
부정적인 가치가 큰 부호 없는 가치에 영향을 미친다는 것을 알고 있지만, 저는 단지 반대쪽에 영향을 미치고 있기 때문에 그것은 중요하지 않습니다.하지만 캐스트가 실제 바이트를 엉망으로 만든다면, 캐스트가 같은 값을 돌려줄지 확신할 수 없습니다.
일반적으로 C에서 캐스팅은 비트 패턴이 아닌 값으로 지정됩니다. 전자는 (가능한 경우) 보존되지만 후자는 반드시 그렇지는 않습니다.정수형을 갖는 고정형에 필수적인 패딩이 없는 2의 보형 표현의 경우 이 구별은 중요하지 않으며 출연진은 실제로 초보자가 될 것입니다.
그러나 서명된 변환에서 서명되지 않은 변환으로 변환하는 경우 비트 패턴이 변경되더라도 이를 다시 변환하면 원래 값이 복원됩니다. 서명되지 않은 변환으로 범위를 벗어났다는 사실이 구현에 정의되어 오버플로에 대한 신호가 발생할 수 있습니다.
완전한 휴대성(과잉이 될 수 있음)을 위해서는 변환 대신 유형 퍼닝을 사용해야 합니다.이 작업은 다음 두 가지 방법 중 하나로 수행할 수 있습니다.
포인터 캐스트를 통해, 즉
uint32_t u = *(uint32_t*)&x;
효과적인 타이핑 규칙을 위반할 수 있으므로 주의해야 할 사항(정수형의 부호가 있는/부호가 없는 변형의 경우는 괜찮습니다) 또는 조합을 통해.
uint32_t u = ((union { int32_t i; uint32_t u; }){ .i = x }).u;
예를 들어 변환하는데 사용될 수도 있습니다.double
로.uint64_t
, 정의되지 않은 동작을 피하고 싶다면 포인터 캐스트를 사용하지 않을 수 있습니다.
C에서 깁스는 "유형 변환"과 "유형 모호성"을 모두 의미합니다.만약 당신이 이런 것을 가지고 있다면,
(float) 3
그러면 유형 변환이 되고 실제 비트가 바뀝니다.만약 당신이
(float) 3.0
일종의 애매모호한 표현입니다.
2의 보어 표현을 가정할 때(아래 주석 참조), 다음을 캐스팅할 때int
.unsigned int
만 변경됩니다. 결과는 됩니다. 다시 캐스트하면 결과는 항상 정확합니다.단지 컴퓨터가 해석하는 방식으로만 비트가 변경되지 않기 때문에 타입 모호성의 경우에 해당됩니다.
보어를 할 수 으로는 2의 의,unsigned
그리고.signed
는 매우 다른 표현을 가질 수 있으며, 이 경우 실제 비트 패턴이 변경될 수 있습니다.
C C11( C ) 로부터가 sizeof(int) == sizeof(unsigned int)
:
(§6.2.5/6) 부호화된 정수형별로 동일한 양의 저장량(부호정보 포함)을 사용하고 동일한 정렬요구량을 가지는 대응(부호화되지 않은) 부호화되지 않은 정수형이 있습니다 [...]
실제로는 안전하다고 가정할 수 있습니다.
안전해야 는, 이기 intXX_t
다음과 같은 유형이 존재할 경우 2개의 보어로 보장됩니다.
7.20.1.1 정확한 너비 정수 유형 intN_t 유형은 너비 N, 패딩 비트 없음, 2의 보어 표현을 가진 부호 있는 정수 유형을 지정합니다.따라서 int8_t는 정확히 8비트의 너비를 가진 부호가 있는 정수 유형을 나타냅니다.
으로는에서 ,uint32_t
.int32_t
입니다에 unsigned
.signed
회심의 회심 것과 할 수 없습니다하지만 플랫폼이 여러분이 기대하는 것과 다르게 작동할 것이라고는 상상할 수 없습니다.
이것을 정말로 확신하고 싶다면 수동으로 변환할 수 있습니다.다에 대한 > INT32_MAX
그리고 나서 수학을 조금 합니다.그것을 체계적으로 한다 하더라도, 괜찮은 컴파일러가 그것을 감지하고 최적화할 수 있어야 합니다.
언급URL : https://stackoverflow.com/questions/19490240/does-cast-between-signed-and-unsigned-int-maintain-exact-bit-pattern-of-variable
'programing' 카테고리의 다른 글
워드프레스 관리자:Custom Post Type(사용자 지정 게시 유형)을 상위 메뉴의 하위 메뉴로 배치할 때 상위 메뉴 링크가 CPT에 의해 재정의됩니다. (0) | 2023.09.21 |
---|---|
안드로이드 스튜디오에서 'libs' 폴더를 추가하는 방법은? (0) | 2023.09.21 |
MariaDB UNION과 함께 선택할 때 텍스트 잘라내기 (0) | 2023.09.21 |
Oracle 생성 트리거 오류(나쁜 바인딩 변수) (0) | 2023.09.21 |
jquery에서 드롭다운 상자 사용/사용 안 함 (0) | 2023.09.21 |