2012-07-08 27 views
0
#include<stdio.h> 

int main() 
{ 
    int c; 
    return 0; 
} // on Intel architecture 

#include <stdio.h> 

int main() 
{ 
    int c; 
    return 0; 
}// on AMD architecture 

/* 這裏我有兩個不同的機器代碼,我想知道「是數據類型依賴於機器的尺寸」 */C中的整數或任何其他數據類型的大小是否依賴於基礎體系結構?

+2

不同機器之間的尺寸絕對可以不同。例如'long'在Windows上是32位,在Linux中是64位。 – Mysticial 2012-07-08 04:49:26

+1

英特爾和AMD不是架構。他們是供應商。 x86是一種體系結構。 – 2012-07-08 05:42:15

+0

@DietrichEpp:嗯,是的,他們不..有時候錯失了 – 2012-07-12 04:20:32

回答

1

在這裏看到: size guarantee for integral/arithmetic types in C and C++

基本C類型的大小取決於實現(編譯器)和體系結構,但它們有一些保證的邊界。因此,一個人不應該硬編碼字體大小,而應該使用sizeof(TYPENAME)來獲取字節長度。

+1

如果你對可移植性很感興趣,你還應該注意,在不同平臺上的字節也可以是不同的大小。 – 2012-07-08 05:47:08

0

它通常會出於性能原因。 C標準定義了所有類型,如charshortintlonglong long和及其無符號對應的最小值的範圍。

但是,Intel和AMD的x86 CPU與大多數x86編譯器的硬件基本相同。至少,他們向程序員公開了相同的寄存器和指令,其中大部分都以相同的方式運行(如果我們考慮什麼是官方定義和記錄的話)。

無論如何,只要該尺寸符合C標準,編譯器或其開發人員就可以使用任何其他尺寸,但不一定與目標硬件上的自然操作數大小相匹配。

1

快速回答:是的,主要是,但是......

C語言中的類型大小取決於編譯器作者的決定,服從標準的要求。

編譯器編寫者的決定往往受CPU架構的強烈影響。例如,C標準表示:

A「普通」 INT對象具有由 架構的執行環境的建議的大小。

雖然留下了很多的空間判斷。

這樣的決定也可以由其它的考慮,例如與來自相同供應商提供的其它的體系結構和具有類型爲每個支持的尺寸的便利性編譯器兼容的影響。例如,在64位系統上,int的明顯「自然大小」是64位,但許多編譯器仍然有32位int。 (用8位char和64位intshort很可能爲16或32位,你不能有基本整數類型涵蓋尺寸。)

(C99引入了「擴展整型」,這可以解決涵蓋所有支持的尺寸的問題,但我不知道有任何編譯器實現它們。)

0

是的。基本數據類型的大小取決於底層的CPU體系結構。 ISO C(和C++)只保證數據類型的最小值大小

但是,在同一個CPU的編譯器廠商中,它並不一致。考慮到英特爾x386 CPU有32位長整數的編譯器,以及其他編譯器會給你64位長。

不要忘記MS程序員在英特爾286機器時代不得不面對的十年左右的痛苦,以及編譯器強加給我們的所有不同「內存模型」。 16位指針與32位分段指針。我很高興那些日子已經過去了。

相關問題