2013-06-29 2 views
0

32 비트 정수에서 bitely 연산을 수행해야합니다 (실제로는 represent chars, 그 밖에도 무엇이든).(uint32_t)를 하드 코딩 된 값과 비교하는 것이 안전합니까?

다음과 같은 종류의 코드가 안전한가요?

uint32_t input; 
input = ...; 

if(input & 0x03000000) { 
    output = 0x40000000; 
    output |= (input & 0xFC000000) >> 2; 

나는 문은 "만약"에, 나는 왼쪽하는 uint32_t에,에 비트 연산을 수행하고, 의미, 그리고 오른쪽에 ... 나도 몰라!

하드 코딩 된 "0x03000000"의 유형 및 크기를 (즉, 얼마나 많은 바이트가 저장되어 있는지에 따라) 알 수 있습니까?

일부 시스템에서는 0x03000000을 int로 생각할 수 있으며 따라서 2 바이트에서만 코드를 작성할 수 있습니까? 이것은 대재앙이 될 수 있습니까?

+1

나에게 완벽하게 잘 보이는 : C의 진수 상수는이 표현 될 수있는 첫 번째 유형이다. –

+1

오른쪽이 가장 작은 정수형으로 승격됩니다 (int보다 짧으면'int'). 비교가 안전합니다. –

+0

1. 언제든지 원하는대로 캐스팅 할 수 있습니다 :'(uint32_t) 0x03000000'. 2. 명확성과 재사용을 위해이 '#define'을 만들어야합니다. 캐스트도 추가 할 수 있습니다 :'#define MYBITS (uint32_t) 0x03000000'. –

답변

1

다음과 같은 종류의 코드가 안전한가요?

예, 그렇습니다.

하드 코딩 된 "0x03000000"의 유형 및 크기를 (따라서 얼마나 많은 바이트가 저장되어 있는지 의미 함) 알 수 있습니까?

0x0300000016-bitint와 시스템 32-bitintlong 갖는 시스템에 int이다.

은 (uint32_t 여기에 존재로서 나는 2의 보수 및 8CHAR_BIT을 가정한다. 또한 내가 16-bitint64-bitlong 어떤 시스템을 모른다.)

는 일부 시스템으로 0x03000000을 고려 그것이 가능인가요 그래서 int는 2 바이트로만 코드화합니다. 이것은 대재앙이 될 것입니까?

0x03000000long하고 32-bit이다하는 16-bitint 시스템에 위의 내용을 참조하십시오. 이 int, unsigned int는, long는, unsigned long는, long longunsigned long long

+0

그래도 0x00000001을 대신 사용하면 어떻게됩니까? 16 비트 시스템에서는 16 비트 정수로 표시됩니다. 그런 다음 32 비트 uint32_t와 16 비트 0x00000001 사이에서 비트 연산을 수행합니다. 오류가 발생하거나 괜찮습니까? – KrisWebDev

+2

'0x00000001'은'int'로 보장됩니다. 'uint32_t'를 사용하는 bitwise 표현식에서 상수는'uint32_t'로 승격되므로 아무런 문제가 없습니다. – ouah

+0

@ouah :'int '가 64 비트 넓이 인 플랫폼에서 양쪽면이'int'로 변환 될 것이라고 생각합니다. –