A. C語言中不同的數據類型的長度和什麼有關
和編譯器有關。
每種類型佔用的位元組數,是和編譯器直接相關的,也就是常說的編譯器的字長。
以整型系列的類型,char, short, int, long為例:
1 16位字長:
對於16位編譯器,char佔1位元組,short佔2位元組,int佔2位元組,long佔4位元組。
2 32位字長:
對於32位編譯器,char 佔1位元組,short佔2位元組,int佔4位元組,long佔4位元組。
3 64位字長:
對於64位編譯器,char佔1位元組,short佔2位元組,int佔4位元組,long佔8位元組。
B. 內存對齊詳解
1、什麼是內存對齊
假設我們聲明兩個變數:
2、結構體內存對齊規則
結構體所佔用的內存與其成員在結構體中的聲明順序有關,其成員的內存對齊規則如下:
(1)每個成員分別按自己的對齊位元組數和PPB(指定的對齊位元組數,32位機默認為4)兩個位元組數最小的那個對齊,這樣可以最小化長度。
(2)復雜類型(如結構)的默認對齊方式是它最長的成員的對齊方式,這樣在成員是復雜類型時,可以最小化長度。
(3)結構體對齊後的長度必須是成員中最大的對齊參數(PPB)的整數倍,這樣在處理數組時可以保證每一項都邊界對齊。
(4)計算結構體的內存大小時,應該列出每個成員的偏移地址,則其長度=最後一個成員的偏移地址+最後一個成員數的長度+最後一個成員的調整參數(考慮PPB)。
3、案例講解:
————————————————
最後輸出的結果為:8
4、注意的問題
(1)位元組對齊取決於編譯器;
(2)一定要注意PPB大小,PPB大小由pragam pack(n)指定;
(3)結構體佔用的位元組數要能夠被PPB整除。
(4)總結出一個公式:結構體的大小等於最後一個成員的偏移量加上其大小再加上末尾的填充位元組數目,即:
sizeof( struct ) = offsetof( last item ) + sizeof( last item ) +sizeof( trailing padding )
————————————————
原文鏈接: https://blog.csdn.net/SzMinglove/java/article/details/8143056
C. C語言數據類型所佔位元組是和運行的機器位數有關還是編譯器有關
1)C語言一般指的是ANSI C的標准,對應的處理器分別是32位和64位的。
2)類型分為內置類型和自定義類型(非內置類型)
內置類型指的是無需聲明就可使用的類型,比如char,double,int等。
自定義類型指的是使用前必須聲明的,如struct StructName{};結構類型,int a[5];數組類型以及enum Color{};枚舉類型等。未經聲明的類型不可使用
3)ANSI C只對內置類型的大小進行了規范:
char |double| folat |int |long int| pointer
64bits 1 8 4 4 8 8
32bits 1 8 4 4 4 4
從上表可以看出,對於前三者,大小是統一的,只有long int 和pointer(指針)在不同的機器上佔用了不同的大小。他們的規則是,long int和pointer的大小等於機器位長(8位一個位元組).最後說明一點,unsigned的關鍵字和類型組合和該類型的大小相同,因為有符號和無符號只對編譯器有效,機器對他一無所知。
D. 關於編譯器 操作系統 CPU
C語言標准規定,int類型最少為2位元組,long類型不能比int類型短。具體多長,由編譯器自行決定。
一般,16位編譯器(如老掉牙的Turbo C 2.0),int類型佔2個位元組,而現代32位編譯器如Visual C++、gcc、Intel C/C++,int類型都是4位元組的。所以如果為了編寫可移植性的程序,不要對數據類型的長度做假設。
佔用多少位元組,主要取決於編譯器。而不是多少位的軟體和CPU,比如x86-64軟硬體系統上,大多數int仍然是4位元組長,比如微軟的Visual C++在生成64位程序的時候就是如此。
這個多少位是指地址匯流排的長度,並不是int類型佔用的位數。
E. c語言bool什麼意思
bool表示布爾型變數,也就是邏輯型變數的定義符,以英國數學家、布爾代數的奠基人喬治·布爾(George Boole)命名。
bool類似於float,double等,只不過float定義浮點型,double定義雙精度浮點型。 在objective-c中提供了相似的類型BOOL,它具有YES值和NO值;在java中則對應於boolean類型。
C99中提供了一個頭文件 <stdbool.h> 定義了bool代表_Bool,true代表1,false代表0。只要導入 stdbool.h ,就能非常方便的操作布爾類型了。
(5)哪些位元組取決於編譯器擴展閱讀:
BOOL和bool區別:
1、類型不同
bool為布爾型用作邏輯判斷
BOOL在<windef.h>typedef int BOOL;
在<wtypes.h>typedef long BOOL;
2、長度不同
bool只有一個位元組
BOOL長度視實際環境來定,一般可認為是4個位元組
3、取值不同
bool取值false和true,0為false,非0為true。(例如-1和2都是true)。
如果數個bool對象列在一起,可能會各佔一個Byte,這取決於編譯器。
BOOL是微軟定義的typedef int BOOL(在windef.h中),0為FALSE,1為TRUE。(-1和2既不是TRUE也不是FALSE)。
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
布爾型變數bool
布爾型變數的值只有 真 (true) 和假 (false)。
布爾型變數可用於邏輯表達式,也就是「或」「與」「非」之類的邏輯運算和大於小於之類的關系運算,邏輯表達式運算結果為真或為假。
bool可用於定義函數類型為布爾型,函數里可以有 return TRUE; return FALSE 之類的語句。
if (邏輯表達式)
{
如果是 true 執行這里;
}
else
{
如果是 false 執行這里;
};
三、關於bool的小例子
(1)
#include<iostream>
using namespace std;
int main()
{
bool b =2; //執行此行後,b=true(整型2轉為bool型後結果為true)
if(b)
cout << "ok!" << endl;
b = b-1; //執行此行後,b=false(bool型數據true參與算術運算時會轉為int值1,減1後結果為0,賦值給b時會轉換為bool值false)
if(b)
cout << "error!" <<endl;
return 0;
}
運行結果:OK!
(2)
#include<iostream>
#include<windef.h>
using namespace std;
int main()
{
BOOL b =2; //執行此行後,b=2(BOOL為int此處不進行類型轉換,b存放的就是2)。
if(b)
cout << "ok!" << endl;
b=b-1; //執行此行後,b=1(只是簡單的進行算術運算,結果為1,回存)
if(b) // b非0,條件為真
cout << "error!" <<endl;
return 0;
}
運行結果:OK!
error!
可以在定義b時改成 bool b=0;看看運行結果。
參考資料來源:網路-BOOL
F. c語言的位元組數是什麼意思
int佔多少個位元組是由編譯器決定的,ANSI標準定義int是佔2個位元組.
TC是按ANSI標準的,它的int是佔2個位元組的.
你可以在TC里試.printf("%d",sizeof(int));結果是2;
但是在VC里,一個int是佔4個位元組的,在VC裡面,
printf("%d",sizeof(int));
cout<<sizeof(int);結果都是4.
不同的編譯器,規定也不一樣.
float,double也是一樣的,在不同的編譯器里,占的位元組是不一樣的.