Was ist der Unterschied zwischen 1 und 1i64 in C ++?

Ich konvertiere 32-Bit-kompatiblen Code in 64-Bit-Code - und habe einen Haken bekommen. Ich kompiliere ein VS2008 x64-Projekt und erhalte die folgende Warnung:

warning C4334: '<<' : result of 32-bit shift implicitly converted to 64 bits
(was 64-bit shift intended?)

Hier ist die ursprüngliche Codezeile:

if ((j & (1 << k)) != 0) {

Und so sieht es aus, wenn ich folgeMicrosofts Rat:

if ((j & (1i64 << k)) != 0) {

Ist dies ungefährlich, wenn der Code sowohl auf 32-Bit- als auch auf 64-Bit-Systemen kompiliert wird? Wenn ja, erklären Sie bitte, warum ich "i64" am Ende hinzufügen muss und warum dies keine Auswirkungen auf eine 32-Bit-Kompilierung hat. Andernfalls wäre eine Umgehung sehr willkommen.

Darüber hinaus habe ich etwas, das wie ein noch kniffligeres Stück Code aussieht.

if (id[j] != id[j ^ (1u << k)]) {

Ich verstehe, dass das "u" bedeutet, dass die Ziffer nicht vorzeichenbehaftet ist, aber wozu sollte das bei einem Wert angegeben werden, der den vorzeichenbehafteten Maximalwert nicht überschreitet ... Ich vermute, das hat etwas mit der Bitverschiebung zu tun?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage