मुझे int64_t को char array और back में कनवर्ट करने में समस्या हो रही है। मुझे नहीं पता कि नीचे दिए गए कोड में क्या गलत है, यह मेरे लिए पूर्ण तार्किक अर्थ बनाता है। कोड दिखाए गए अनुसार a
के लिए काम करता है, लेकिन दूसरा नंबर b
नहीं है जो स्पष्ट रूप से int64_t की सीमा में आता है।मैं 64 बिट पूर्णांक को चार सरणी में वापस कैसे बदलूं?
#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;
}
उत्पादन
aNum = 123456789
bNum = 71777215744221775
कोड भी दो चेतावनी है कि मैं नहीं जानता कि से छुटकारा पाने के लिए कैसे देता है।
warning: integer constant is too large for ‘unsigned long’ type
warning: left shift count >= width of type
दूसरी चेतावनी कुंजी है। '<<' के संचालन को 'int' में पदोन्नत किया जाता है, इसलिए 'एक [0] << 56' हमेशा 0 होगा।' ((Int64_t) एक [0]) 'आदि पहली चेतावनी लगभग 51544720029426255 है , आपको 51544720029426255LL कहना होगा। –
http://ideone.com/dKIWT – aroth