51. 비트필드(bit-field)의 레이아웃과 부호
난이도 중 해설 보기 →
결함을 모두 찾고 원인·수정안·더 나은 설계를 제시하라. 마커
(A)(B) 는 주목 위치 힌트다.
결함 코드 · C++
// ============================================================================
// [언어 내부동작 문제] C++ — 비트필드(bit-field)의 레이아웃과 부호
// ----------------------------------------------------------------------------
// 주제:
// 비트필드의 메모리 배치, 크기(sizeof), 그리고 부호 있는(signed) 비트필드의 값 범위를
// 예측하고 설명하라. 패킷/플래그를 압축 표현할 때 흔히 쓰지만 함정이 많다.
//
// 과제:
// 1) 아래 프로그램의 표준 출력을 순서대로 예측하라.
// 2) sizeof(A), sizeof(B), sizeof(C) 가 왜 그런 값이 되는지(기반 타입·패킹·정렬) 설명하라.
// 3) c.s1 에 1 을 넣었는데 출력이 왜 그렇게 나오는지(폭 1의 signed 비트필드) 설명하라.
// 4) 어떤 부분이 구현 정의(implementation-defined)/비이식적인지 지적하라.
//
// 빌드/실행: g++ -std=c++17 problem.cpp && ./a.out
// ============================================================================
#include <cstdint>
#include <iostream>
using std::cout;
struct A { uint8_t x : 1; uint8_t y : 3; uint8_t z : 4; };
struct B { uint16_t type : 4; uint16_t len : 12; };
struct C { int s1 : 1; int s4 : 4; };
int main() {
cout << "sizeof(A)=" << sizeof(A) << "\n";
cout << "sizeof(B)=" << sizeof(B) << "\n";
cout << "sizeof(C)=" << sizeof(C) << "\n";
A a{}; a.x = 1; a.y = 5; a.z = 15;
cout << "a: " << +a.x << " " << +a.y << " " << +a.z << "\n";
B b{}; b.type = 9; b.len = 4000;
cout << "b: " << b.type << " " << b.len << "\n";
C c{}; c.s1 = 1; c.s4 = 7;
cout << "c.s1=" << c.s1 << " c.s4=" << c.s4 << "\n";
c.s4 = -8;
cout << "c.s4(-8)=" << c.s4 << "\n";
return 0;
} 내 리뷰 · C++
내 답안 · 자동 저장
작성 후 위 해설 보기에서 모범 해설과 대조하세요.