programing

서명된 int와 서명되지 않은 int 사이의 캐스트는 메모리에서 변수의 정확한 비트 패턴을 유지합니까?

stoneblock 2023. 9. 21. 20:02

서명된 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