비트 필드에 값을 할당해도 동일한 값이 반환되지 않는 이유는 무엇입니까?
#include <stdio.h>
struct mystruct { int enabled:1; };
int main()
{
struct mystruct s;
s.enabled = 1;
if(s.enabled == 1)
printf("Is enabled\n"); // --> we think this to be printed
else
printf("Is disabled !!\n");
}
C++ 모두, 코드의 출력은 예기치 않습니다.
디세이블!!
그 투고에는 「사인 비트」에 관한 설명이 있습니다만, 무엇인가를 설정해 놓고, 그대로 반영하지 않는 것이 어떻게 가능한 것인지 이해할 수 없습니다.
누가 좀 더 자세히 설명해 주시겠어요?
주의: 태그 c와 c++는 모두 필요합니다.비트필드를 기술하는 기준이 약간 다르기 때문입니다.C 사양 및 C++ 사양에 대한 답변을 참조하십시오.
비트필드는 표준으로 정의되어 있지 않습니다. 「 」가 지정되면, 「」가 됩니다.struct mystruct {int enabled:1;};
그럼 알 수 없습니다.
- 패딩 비트/바이트가 있는 경우 및 메모리 내의 위치.
- 비트가 메모리에 있는 위치.정의되어 있지 않고, 엔디안리스에 의해서도 다릅니다.
- ''의
int:n
비트필드 부호
마지막 부분에 대해 C17 6.7.2.1/10에는 다음과 같이 기술되어 있습니다.
비트필드는 지정된 비트수로 이루어진 부호 있는 정수형 또는 부호 없는 정수형으로 해석됩니다.
위의 내용을 설명하는 비규격 주:
125) 위의 6.7.2에서 지정한 바와 같이 사용되는 실제 유형 지정자가
int
"typedef-name"으로 을 사용합니다.int
다음으로 비트필드가 서명되어 있는지, 서명되어 있지 않은지가 실장 정의됩니다.
가 트필음음 음음음음음으로 signed int
수 있습니다.1
데이터 저장공간은 없습니다.기호 비트만 사용할 수 있습니다.따라서 일부 컴파일러에서 프로그램이 이상한 결과를 나타낼 수 있습니다.
베스트 프랙티스:
- 비트필드는 어떤 목적으로도 사용하지 마십시오.
- 있는 기호는 하지 않도록 합니다.
int
모든 형식의 비트 조작에 사용할 수 있습니다.
저는 이해할 수 없습니다만, 어떻게 설정해 놓고 그대로 표시되지 않는 것입니까.
컴파일된 이유와 오류가 발생하는 이유를 묻는 건가요?
가 날 .컴파일러의 경고를 사용하면 문제가 발생합니다. 、 GCC g 、-Werror -Wall -pedantic
:
main.cpp: In function 'int main()':
main.cpp:7:15: error: overflow in conversion from 'int' to 'signed char:1'
changes value from '1' to '-1' [-Werror=overflow]
s.enabled = 1;
^
왜 이것이 구현 정의와 오류에 맡겨지는지에 대한 이유는 과거의 사용법과 더 관련이 있을 수 있습니다. 여기서 캐스팅을 요구하는 것은 오래된 코드를 깨는 것을 의미합니다.이 표준의 저자들은 경고가 관련자들의 공백을 메우기에 충분했다고 생각할 수 있다.
규범주의를 도입하기 위해 @Lundin의 "비트필드를 어떤 목적으로도 사용하지 마십시오."라는 문구를 반영합니다.처음에 비트필드가 필요하다고 생각될 정도로 메모리 레이아웃의 상세 내용을 상세하게 파악해야 하는 타당한 이유가 있다면, 그 외의 관련 요건은 그 사양 미달과 거의 일치합니다.
(TL;DR - 비트필드가 합법적으로 "필요"할 정도로 정교하다면 비트필드가 충분히 정의되지 않은 것입니다.)
이것은 구현 정의 동작입니다.하고 있는 의 보완 를 사용하고 , 그것을 취급하고 .int
이 경우 if 문의 참 부분인 경우 입력하지 않는 이유를 설명하는 부호 있는 정수로 표시됩니다.
struct mystruct { int enabled:1; };
enable
1번으로 하다서명되어 있기 때문에 유효한 값은 다음과 같습니다.-1
★★★★★★★★★★★★★★★★★」0
. 를 .로 1
to 」(비트가 오버플로우)로 되돌아가다-1
되지 않은입니다)
으로 부호 때은 """입니다.2^(bits - 1) - 1
, 「」입니다.0
★★★★★★★★★★★★★★★★★★,
2의 보계에서는 맨 왼쪽의 비트가 부호 비트라고 생각할 수 있습니다.따라서 맨 왼쪽의 비트가 설정된 부호 있는 정수는 음의 값이 됩니다.
1비트 부호 있는 정수가 있는 경우 부호 비트만 있습니다. " " "를 할당한다.1
부호 비트만 설정할 수 있습니다.그래서 다시 읽을 때 값은 음으로 해석되고 -1도 음으로 해석됩니다.
있는 수 은 1비트 부호 있는 정수입니다.-2^(n-1)= -2^(1-1)= -2^0= -1
★★★★★★★★★★★★★★★★★」2^n-1= 2^1-1=0
C++ 규격 n4713에 따라 매우 유사한 코드 스니펫이 제공된다.사용하는 타입은BOOL
(커스텀) 단, 모든 유형에 적용할 수 있습니다.
12.2.4
4 true 또는 false 값이 비트필드에 저장되어 있는 경우
bool
의 '1비트필드bool
비트 필드의 값과 값이 같아야 합니다.열거자 값이 동일한 열거형 비트필드에 저장되고 비트필드 내의 비트 수가 해당 열거형(10.2)의 모든 값을 유지할 수 있을 만큼 충분히 클 경우 원래 열거자 값과 비트필드 값이 같아야 합니다.[예:enum BOOL { FALSE=0, TRUE=1 }; struct A { BOOL b:1; }; A a; void f() { a.b = TRUE; if (a.b == TRUE) // yields true { /* ... */ } }
: end 예시]
언뜻 보면 굵은 글씨로 해석할 수 있는 부분이 열려 있는 것처럼 보입니다.이 말이 , 이 말이 , 이 말이 , 이 말이 맞다, 이 말이 맞다, 이 말이 , 이 말이 말이 됩니다.enum BOOL
은 ''에서 유래한 말입니다.int
.
enum BOOL : int { FALSE=0, TRUE=1 }; // ***this line
struct mystruct { BOOL enabled:1; };
int main()
{
struct mystruct s;
s.enabled = TRUE;
if(s.enabled == TRUE)
printf("Is enabled\n"); // --> we think this to be printed
else
printf("Is disabled !!\n");
}
경고를 .-Wall -pedantic
:
'는 너무 ' BOOL'의 모든 을 유지할 수 .
struct mystruct { BOOL enabled:1; };
출력은 다음과 같습니다.
★★★★★★★★★★★★★★★★
enum BOOL : int
)
ifenum BOOL : int
하게 enum BOOL
출력은 위의 표준 패시지가 지정한 대로입니다.
(「」(「」)를 사용하고 경우
enum BOOL
)
따라서 이 타입은 다른 몇 가지 답변과 달리 단일 비트필드에 값 "1"을 저장할 수 있을 만큼 크지 않다는 결론을 내릴 수 있습니다.
제가 볼 수 있는 비트필드에 대한 당신의 이해에는 아무런 문제가 없습니다.처음에 mystruct { int enabled : 1 ; } 으로 mystruct를 재정의하고 다음으로 structure mystructs로 정의했습니다.코드화할 필요가 있는 것은, 다음과 같습니다.
#include <stdio.h>
struct mystruct { int enabled:1; };
int main()
{
mystruct s; <-- Get rid of "struct" type declaration
s.enabled = 1;
if(s.enabled == 1)
printf("Is enabled\n"); // --> we think this to be printed
else
printf("Is disabled !!\n");
}
언급URL : https://stackoverflow.com/questions/53853540/why-is-assigning-a-value-to-a-bit-field-not-giving-the-same-value-back
'programing' 카테고리의 다른 글
C 프로그램에서 X코드로 명령줄 인수 제공 (0) | 2022.07.12 |
---|---|
어떻게 자바에 천을 똑같이 복사해야 한다고? (0) | 2022.07.12 |
Vue에서 임의 슬롯 액세스 (0) | 2022.07.12 |
대규모 웹 사이트의 Vuex 스토어 아키텍처 (0) | 2022.07.12 |
ConcurrentHashMap에 대한 ConcurrentHashSet이 없는 이유 (0) | 2022.07.05 |