dest_t transform(src_t *s, dest_t *d)
{
*d = (dest_t)*s;
return *d;
}
src_t : char, dest_t : unsigned이고
어셈블리는 아래처럼 찍히는데요.
transform:
movsbl (%rdi), x
movl x, (%rsi)
ret
왜 최상위비트로 상위비트를 채우는 movs로 하는거죠?
unsigned면 최상위비트가 1이면 안되지않나요. 저렇게하면 56비트가 1로 찍힐수도 있잖아요.
unsigned나 signed는 비트표현을 해석하는 방법의 차이라지만 그래도 없던 비트를 찍어내는게 맞는건가요?
캐스팅임?
개고수;
네 캐스팅이예요
로 챵또 쿄또 이키따 ㅡ 이 ..
이거 어제 물어보셨길래 찾아봤는데
뭘로 확장하던지간에 비부호형을 더 큰 부호형으로 확장하면 zero-extension이 일어나서 무조건 0을 추가하는거고 부호형이면 signed extension이라 저렇게된데요
안될건 없을텐데.. 1로 다채울수도 있지..
뭘로 확장하는지가 중요한게 아니라 현재 타입만 따짐
사실 CSAPP에 나옴ㅎ
1로채우는건 확장해도 음수값이 유지되게 하는거고
MSB가 1인데 1로 확장하지 않으면 값이 어그러질거임. 4비트랑 8비트로 계산해봐요
그렇군요. 그럼 그냥 법칙같은건가요?
부호형 -> 부호형이나 비부호형 -> 비부호형이면 직관적인데 비부호형 -> 부호형이나 부호형 -> 비부호형이면 헷갈리는
걍 원래타입 기준으로 확장
그래서 흔히들 1.한 타입만 쓰거나(사인드만) 2.학실히 구분해서 쓰거나(비트를 다룰때만 언사인드) 3.C/C++을 쓰지 않음(굿굿하하하)
어 뭐 삼대장이 들쑤셔놔서 내가 건드릴게 없고만. 엣헴.
copy 가 아니라 transform 이라 부호유지가 의미있는것. 이상.
크게 상관 없고....신경 안쓰셔도 별탈없이 처리될겁니다...그리고 56비트라고 하셨는데요....레지스터는 64비트이지만 movsbl과 movl의 l은 32비트를 의미합니다...64비트로 처리하려면 l 대신 q를 사용해야 합니다...