Hi,
thank you all for your replies. I made a mistake and forgot that it is a volatile variable because it is used in an interrupt function. This code:
void setup()
{
Serial.begin(250000);
uint64_t BitFolge = (69ULL << 40);
if ((BitFolge & (255ULL << 40)) == (69ULL << 40))
{
Serial.println("yes left shift");
}
if (((BitFolge>>40) & 255ULL) == 69ULL)
{
Serial.println("yes right shift");
}
volatile uint64_t BitFolge_volatile = (69ULL << 40);
if ((BitFolge_volatile & (255ULL << 40)) == (69ULL << 40))
{
Serial.println("yes left shift volatile");
}
if (((BitFolge_volatile>>40) & 255ULL) == 69ULL)
{
Serial.println("yes right shift volatile");
}
}
void loop()
{
}
has this output:
yes left shift
yes right shift
yes right shift volatile
If I use an uint32_t variable (shift only by 11 bits to fit it into 32 bits), everything works fine:
void setup()
{
Serial.begin(250000);
uint32_t BitFolge = (69ULL << 11);
if ((BitFolge & (255ULL << 11)) == (69ULL << 11))
{
Serial.println("yes left shift");
}
if (((BitFolge>>11) & 255ULL) == 69ULL)
{
Serial.println("yes right shift");
}
volatile uint32_t BitFolge_volatile = (69ULL << 11);
if ((BitFolge_volatile & (255ULL << 11)) == (69ULL << 11))
{
Serial.println("yes left shift volatile");
}
if (((BitFolge_volatile>>11) & 255ULL) == 69ULL)
{
Serial.println("yes right shift volatile");
}
}
gives:
yes left shift
yes right shift
yes left shift volatile
yes right shift volatile
How can the volatile property affect the comparison? Both volatile and non volatile variables contain the same data:
void setup()
{
Serial.begin(250000);
uint64_t BitFolge = (69ULL << 40);
Serial.println((uint32_t)(BitFolge>>32));
Serial.println((uint32_t)(BitFolge&0xFFFFFFFF));
volatile uint64_t BitFolge_volatile = (69ULL << 40);
Serial.println((uint32_t)(BitFolge_volatile>>32));
Serial.println((uint32_t)(BitFolge_volatile&0xFFFFFFFF));
}
gives:
17664
0
17664
0