Int64_t öğesini bir char dizisine dönüştürmede sorun yaşıyorum. Aşağıdaki kodda neyin yanlış olduğunu bilmiyorum, mantıklı bir mantığa sahiptir. Kod, gösterildiği gibi a
için çalışır, ancak int64_t aralığının içine düştüğü ikinci sayı olan b
'u çalıştırmaz.64 bit tamsayı bir char dizisine ve arkaya nasıl dönüştürebilirim?
#include <stdio.h>
#include <stdint.h>
void int64ToChar(char mesg[], int64_t num) {
for(int i = 0; i < 8; i++) mesg[i] = num >> (8-1-i)*8;
}
int64_t charTo64bitNum(char a[]) {
int64_t n = 0;
n = ((a[0] << 56) & 0xFF00000000000000U)
| ((a[1] << 48) & 0x00FF000000000000U)
| ((a[2] << 40) & 0x0000FF0000000000U)
| ((a[3] << 32) & 0x000000FF00000000U)
| ((a[4] << 24) & 0x00000000FF000000U)
| ((a[5] << 16) & 0x0000000000FF0000U)
| ((a[6] << 8) & 0x000000000000FF00U)
| (a[7] & 0x00000000000000FFU);
return n;
}
int main(int argc, char *argv[]) {
int64_t a = 123456789;
char *aStr = new char[8];
int64ToChar(aStr, a);
int64_t aNum = charTo64bitNum(aStr);
printf("aNum = %lld\n",aNum);
int64_t b = 51544720029426255;
char *bStr = new char[8];
int64ToChar(bStr, b);
int64_t bNum = charTo64bitNum(bStr);
printf("bNum = %lld\n",bNum);
return 0;
}
çıkış kodu da ben kurtulmak için nasıl bilmiyorum iki uyarı verir
aNum = 123456789
bNum = 71777215744221775
olduğunu.
warning: integer constant is too large for ‘unsigned long’ type
warning: left shift count >= width of type
ikinci uyarı anahtarıdır. "<<" işlenenleri "int" olarak tanıtılır, bu yüzden bir [0] << 56 'her zaman 0 olacaktır. Deneme ((int64_t) a [0]) 'vb. İlk uyarı yaklaşık 51544720029426255 hakkındadır. 51544720029426255LL demek zorundasınız. –
http://ideone.com/dKIWT – aroth