簡體   English   中英

數據類型之間c的類型轉換

[英]typecasting in c between data types

我寫了這個小代碼來測試我的理解。 但不了解背后的事實。 我正在使用64位小字節序機器。 所以任何指針都是8個字節。 那意味着

#include<stdio.h>
int main(){
    char *c = (char *)0x12345678889;
    long a = 1;
    int b = (long)(c-a);
    /* int cc = (int)(c-a); gives compiler error */
    printf("val = %x and b = %x", c-a,b);
    return 0;
}
Output
val = 45678888 and b = 45678888

假設起始地址為100。因此char*將以100-> 89、101-> 88 ... 105-> 12的形式存儲在內存中,並且字節106和107將不被使用。 我的這種假設首先正確嗎? 由於int和long在64位計算機中為4個字節,因此它將從100,101,102和103開始,並且僅考慮這些字節。 所以45678889-1 =45678888。我的理解正確嗎? 最后,我不明白注釋行給出了編譯器錯誤。 編譯器已隱式地轉換了上面的行。 但是為什么不低於?

首先,您不了解先驗值的存儲方式,這取決於機器的耐久性 值可以從最低到最高數字存儲,也可以相反存儲。 您的排名從低到高。

其次,在許多64位計算機上,int長4個字節,長8個字節。 什么情況是,你的機器計算ca0x12345678888類型(char *)然后將其轉換成一個long與價值0x12345678888 ,然后截斷它靜靜地(多頭正在悄悄轉換為整數在C)。

該注釋發出警告,因為cachar *類型,並且無法將其靜默轉換為int (認為int很危險,dans很危險)。 好的,然后您對其進行了顯式轉換,但是編譯器警告您它也很危險。 請注意,這些只是警告而非錯誤(可能取決於編譯器選項...)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM