我已經寫了下面的代碼:區別正常的演員和指針強制
void union_bytes() {
float fnum = 1209.1996f;
union endian {
float fnum;
int inum;
unsigned char cnum[4];
}instance;
instance.fnum = fnum;
printf("Number = %f\nLittle Endian = %.2x %.2x %.2x %.2x\nHex = %x\n", instance.fnum, instance.cnum[0],
instance.cnum[1], instance.cnum[2], instance.cnum[3], instance.inum);
}
void pointer_bytes() {
float fnum = 1209.1996f;
int *ptr_inum = (int*)&fnum;;
unsigned char *cbytes = (unsigned char *)&fnum;
printf("Number = %f\nLittle Endian = %.2x %.2x %.2x %.2x\nHex = %x\n", fnum, cbytes[0], cbytes[1], cbytes[2], cbytes[3], *ptr_inum);
}
,我想知道,爲什麼我必須做這樣的事情:爲了得到小端int *ptr_inum = (int*)&fnum;
,和我不能這樣做是這樣的:
int inum = (int)fnum;
我想,最後的選擇力量FNUM失去一些字節,但我仍然不知道電話號碼如何如代表內存(和字節是完全喪失)。
爲什麼在這種情況下:
unsigned char ch[4] = { 0x3b, 0x51, 0x7a, 0x24 };
float f = *(float*)ch;
當涉及到鑄造,CH犯規給第一nible 0x3b這是再浮動,而不是將其轉換所有表複利整個浮動的字節數。
感謝
所以我想在這裏:unsigned char ch [4] = {0x3b,0x51,0x7a,0x24}; float f = *(float *)ch;編譯器使用下一個字節填充剩餘的字節,因爲它可以填充4個字節? – DonkeyDoe
ch是一個指向unsigned char的const指針,所以(float)ch是一個嘗試將指針(即地址)轉換爲浮點數。這是沒有道理的,是非法的。 – mzu
如果你的意思是'*(float *)ch',那麼計算機會嘗試將這4個字節解釋爲一些浮點數(本例中爲5.4278914E-17) – mzu