㈠ c語言程序問題
首先,你的b的值在計算的時候有可能是浮點型,然而你卻用長整型肯定出錯;
其次,即使以後都要圓整為整型,你的那些字面常量後面都應該加個L;
最後,如果要輸出為整型則輸入輸出函數中建議把%d改為%ld;
㈡ C語言中函數值為整型中整型是什麼意思
通常泛指char、short int、int、long int、long long int這五種類型(包括signed和unsigned)以及_Bool類型。當然也包括編譯器作為擴展而實現的某些整型類型。
見C11標准:
[6.2.5-4]There are five standard signed integer types, designated as signed char, short int, int, long int, and long long int. (These and other types may be designated in several additional ways, as described in 6.7.2.) There may also be implementation-defined extended signed integer types. The standard and extended signed integer types are collectively called signed integer types.
[6.2.5-6]For each of the signed integer types, there is a corresponding (but different) unsigned integer type (designated with the keyword unsigned) that uses the same amount of storage (including sign information) and has the same alignment requirements. The type _Bool and the unsigned integer types that correspond to the standard signed integer types are the standard unsigned integer types. The unsigned integer types that correspond to the extended signed integer types are the extended unsigned integer types. The standard and extended unsigned integer types are collectively called unsigned integer types.
㈢ 圓整的意思是什麼
通常理解為數據修正。
一個直觀的例子是:
我們按一系列數據繪制一條曲線(或直線)時,將偏離該軌跡的數據坐標修正到該軌跡上,以使線條平滑。這就叫數據圓整。
㈣ c語言怎麼圓整整數
這是一道題還是兩道題?在這里我就先按兩道題寫了:判斷是否是閏年:main(){intYear;scanf(「%d」,&Year);if(Year9999){if((Year%4==0&&Year%100!=0)||Year%400==0)printf("%d年是潤年",Year);elseprintf("%d年不是潤年",Year);}else{printf("請輸入正確的年份");}}判斷是否為整數:main(){intNumber;scanf(「%d」,&Number);while((int)Number!=Number){//將輸入的書強制轉換為整形,如果兩個數一致則輸入的為整數printf("不是整數,請重新輸入:");scanf(「%d」,&Number);}}
㈤ c++中內存是如何對齊的
有虛函數的話就有虛表,虛表保存虛函數地址,一個地址佔用的長度根據編譯器不同有可能不同,vs裡面是8個位元組,在devc++裡面是4個位元組。類和結構體的對齊方式相同,有兩條規則
1、數據成員對齊規則:結構(struct)(或聯合(union))的數據成員,第一個數據成員放在offset為0的地方,以後每個數據成員的對齊按照#pragma pack指定的數值和這個數據成員自身長度中,比較小的那個進行。
2、結構(或聯合)的整體對齊規則:在數據成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大數據成員長度中,比較小的那個進行
下面是我收集的關於內存對齊的一篇很好的文章:
在最近的項目中,我們涉及到了「內存對齊」技術。對於大部分程序員來說,「內存對齊」對他們來說都應該是「透明的」。「內存對齊」應該是編譯器的 「管轄范圍」。編譯器為程序中的每個「數據單元」安排在適當的位置上。但是C語言的一個特點就是太靈活,太強大,它允許你干預「內存對齊」。如果你想了解更加底層的秘密,「內存對齊」對你就不應該再透明了。
一、內存對齊的原因
大部分的參考資料都是如是說的:
1、平台原因(移植原因):不是所有的硬體平台都能訪問任意地址上的任意數據的;某些硬體平台只能在某些地址處取某些特定類型的數據,否則拋出硬體異常。
2、性能原因:數據結構(尤其是棧)應該盡可能地在自然邊界上對齊。原因在於,為了訪問未對齊的內存,處理器需要作兩次內存訪問;而對齊的內存訪問僅需要一次訪問。
二、對齊規則
每個特定平台上的編譯器都有自己的默認「對齊系數」(也叫對齊模數)。程序員可以通過預編譯命令#pragma pack(n),n=1,2,4,8,16來改變這一系數,其中的n就是你要指定的「對齊系數」。
規則:
1、數據成員對齊規則:結構(struct)(或聯合(union))的數據成員,第一個數據成員放在offset為0的地方,以後每個數據成員的對齊按照#pragma pack指定的數值和這個數據成員自身長度中,比較小的那個進行。
2、結構(或聯合)的整體對齊規則:在數據成員完成各自對齊之後,結構(或聯合)本身也要進行對齊,對齊將按照#pragma pack指定的數值和結構(或聯合)最大數據成員長度中,比較小的那個進行。
3、結合1、2顆推斷:當#pragma pack的n值等於或超過所有數據成員長度的時候,這個n值的大小將不產生任何效果。
三、試驗
我們通過一系列例子的詳細說明來證明這個規則吧!
我試驗用的編譯器包括GCC 3.4.2和VC6.0的C編譯器,平台為Windows XP + Sp2。
我們將用典型的struct對齊來說明。首先我們定義一個struct:
#pragma pack(n) /* n = 1, 2, 4, 8, 16 */
struct test_t {
int a;
char b;
short c;
char d;
};
#pragma pack(n)
首先我們首先確認在試驗平台上的各個類型的size,經驗證兩個編譯器的輸出均為:
sizeof(char) = 1
sizeof(short) = 2
sizeof(int) = 4
我們的試驗過程如下:通過#pragma pack(n)改變「對齊系數」,然後察看sizeof(struct test_t)的值。
1、1位元組對齊(#pragma pack(1))
輸出結果:sizeof(struct test_t) = 8 [兩個編譯器輸出一致]
分析過程:
1) 成員數據對齊
#pragma pack(1)
struct test_t {
int a; /* 長度4 < 1 按1對齊;起始offset=0 0%1=0;存放位置區間[0,3] */
char b; /* 長度1 = 1 按1對齊;起始offset=4 4%1=0;存放位置區間[4] */
short c; /* 長度2 > 1 按1對齊;起始offset=5 5%1=0;存放位置區間[5,6] */
char d; /* 長度1 = 1 按1對齊;起始offset=7 7%1=0;存放位置區間[7] */
};
#pragma pack()
成員總大小=8
2) 整體對齊
整體對齊系數 = min((max(int,short,char), 1) = 1
整體大小(size)=$(成員總大小) 按 $(整體對齊系數) 圓整 = 8 /* 8%1=0 */ [注1]
2、2位元組對齊(#pragma pack(2))
輸出結果:sizeof(struct test_t) = 10 [兩個編譯器輸出一致]
分析過程:
1) 成員數據對齊
#pragma pack(2)
struct test_t {
int a; /* 長度4 > 2 按2對齊;起始offset=0 0%2=0;存放位置區間[0,3] */
char b; /* 長度1 < 2 按1對齊;起始offset=4 4%1=0;存放位置區間[4] */
short c; /* 長度2 = 2 按2對齊;起始offset=6 6%2=0;存放位置區間[6,7] */
char d; /* 長度1 < 2 按1對齊;起始offset=8 8%1=0;存放位置區間[8] */
};
#pragma pack()
成員總大小=9
2) 整體對齊
整體對齊系數 = min((max(int,short,char), 2) = 2
整體大小(size)=$(成員總大小) 按 $(整體對齊系數) 圓整 = 10 /* 10%2=0 */
3、4位元組對齊(#pragma pack(4))
輸出結果:sizeof(struct test_t) = 12 [兩個編譯器輸出一致]
分析過程:
1) 成員數據對齊
#pragma pack(4)
struct test_t {
int a; /* 長度4 = 4 按4對齊;起始offset=0 0%4=0;存放位置區間[0,3] */
char b; /* 長度1 < 4 按1對齊;起始offset=4 4%1=0;存放位置區間[4] */
short c; /* 長度2 < 4 按2對齊;起始offset=6 6%2=0;存放位置區間[6,7] */
char d; /* 長度1 < 4 按1對齊;起始offset=8 8%1=0;存放位置區間[8] */
};
#pragma pack()
成員總大小=9
2) 整體對齊
整體對齊系數 = min((max(int,short,char), 4) = 4
整體大小(size)=$(成員總大小) 按 $(整體對齊系數) 圓整 = 12 /* 12%4=0 */
4、8位元組對齊(#pragma pack(8))
輸出結果:sizeof(struct test_t) = 12 [兩個編譯器輸出一致]
分析過程:
1) 成員數據對齊
#pragma pack(8)
struct test_t {
int a; /* 長度4 < 8 按4對齊;起始offset=0 0%4=0;存放位置區間[0,3] */
char b; /* 長度1 < 8 按1對齊;起始offset=4 4%1=0;存放位置區間[4] */
short c; /* 長度2 < 8 按2對齊;起始offset=6 6%2=0;存放位置區間[6,7] */
char d; /* 長度1 < 8 按1對齊;起始offset=8 8%1=0;存放位置區間[8] */
};
#pragma pack()
成員總大小=9
2) 整體對齊
整體對齊系數 = min((max(int,short,char), 8) = 4
整體大小(size)=$(成員總大小) 按 $(整體對齊系數) 圓整 = 12 /* 12%4=0 */
5、16位元組對齊(#pragma pack(16))
輸出結果:sizeof(struct test_t) = 12 [兩個編譯器輸出一致]
分析過程:
1) 成員數據對齊
#pragma pack(16)
struct test_t {
int a; /* 長度4 < 16 按4對齊;起始offset=0 0%4=0;存放位置區間[0,3] */
char b; /* 長度1 < 16 按1對齊;起始offset=4 4%1=0;存放位置區間[4] */
short c; /* 長度2 < 16 按2對齊;起始offset=6 6%2=0;存放位置區間[6,7] */
char d; /* 長度1 < 16 按1對齊;起始offset=8 8%1=0;存放位置區間[8] */
};
#pragma pack()
成員總大小=9
2) 整體對齊
整體對齊系數 = min((max(int,short,char), 16) = 4
整體大小(size)=$(成員總大小) 按 $(整體對齊系數) 圓整 = 12 /* 12%4=0 */
四、結論
8位元組和16位元組對齊試驗證明了「規則」的第3點:「當#pragma pack的n值等於或超過所有數據成員長度的時候,這個n值的大小將不產生任何效果」。另外內存對齊是個很復雜的東西,上面所說的在有些時候也可能不正確。呵呵^_^
[注1]
什麼是「圓整」?
舉例說明:如上面的8位元組對齊中的「整體對齊」,整體大小=9 按 4 圓整 = 12
圓整的過程:從9開始每次加一,看是否能被4整除,這里9,10,11均不能被4整除,到12時可以,則圓整結束。
㈥ c語言是什麼意思
C語言是一門面向過程的、抽象化的通用程序設計語言,廣泛應用於底層開發。C語言能以簡易的方式編譯、處理低級存儲器。C語言是僅產生少量的機器語言以及不需要任何運行環境支持便能運行的高效率程序設計語言。
盡管C語言提供了許多低級處理的功能,但仍然保持著跨平台的特性,以一個標准規格寫出的C語言程序可在包括類似嵌入式處理器以及超級計算機等作業平台的許多計算機平台上進行編譯。
最新的C語言標準是C18。
(6)c語言圓整是什麼意思擴展閱讀:
通過對C語言進行研究分析,總結出其主要特點如下:
(1)簡潔的語言
C語言包含的各種控制語句僅有9種,關鍵字也只有32個,程序的編寫要求不嚴格且以小寫字母為主,對許多不必要的部分進行了精簡。
實際上,語句構成與硬體有關聯的較少,且C語言本身不提供與硬體相關的輸入輸出、文件管理等功能,如需此類功能,需要通過配合編譯系統所支持的各類庫進行編程,故c語言擁有非常簡潔的編譯系統。
(2)具有結構化的控制語句
C語言是一種結構化的語言,提供的控制語句具有結構化特徵,如for語句、if...else語句和switch語句等。可以用於實現函數的邏輯控制,方便麵向過程的程序設計。
(3)豐富的數據類型
C語言包含的數據類型廣泛,不僅包含有傳統的字元型、整型、浮點型、數組類型等數據類型,還具有其他編程語言所不具備的數據類型,其中以指針類型數據使用最為靈活,可以通過編程對各種數據結構進行計算。
(4)豐富的運算符
C語言包含34個運算符,它將賦值、括弧等均是作運算符來操作,使C程序的表達式類型和運算符類型均非常豐富。
(5)可對物理地址進行直接操作
C語言允許對硬體內存地址進行直接讀寫,以此可以實現匯編語言的主要功能,並可直接操作硬體。C語言不但具備高級語言所具有的良好特性,又包含了許多低級語言的優勢,故在系統軟體編程領域有著廣泛的應用。
(6)代碼具有較好的可移植性
C語言是面向過程的編程語言,用戶只需要關注所被解決問題的本身,而不需要花費過多的精力去了解相關硬體,且針對不同的硬體環境,在用C語言實現相同功能時的代碼基本一致;
不需或僅需進行少量改動便可完成移植,這就意味著,對於一台計算機編寫的C程序可以在另一台計算機上輕松地運行,從而極大的減少了程序移植的工作強度。
(7)可生成高質量、目標代碼執行效率高的程序
與其他高級語言相比,C語言可以生成高質量和高效率的目標代碼,故通常應用於對代碼質量和執行效率要求較高的嵌入式系統程序的編寫。
㈦ c語言 整型是什麼意思
C語言中的整形,是計算機中的一個基本專業術語,指沒有小數部分的數據。整型值可以用十進制,十六進制或八進制符號指定,前面可以加上可選的符號(- 或者 +)。如果用八進制符號,數字前必須加上 0(零),用十六進制符號數字前必須加上 0x。
在C語言中,整型包括整型常量和整型變數,整型變數又包括短整型、基本整型、長整型,它們都分為有符號和無符號兩種版本,是一種智能的計算方式。
整型變數的值可以是十進制,八進制,十六進制,但在內存中存儲著是二進制數。變數顧名思義是數值可以變的量,整型變數表示的是整數類型的數據。
(7)c語言圓整是什麼意思擴展閱讀:
整型常量分類
1、八進制整常數:必須以0開頭,即以0作為八進制數的前綴。數碼取值為0~7。八進制數通常是無符號數。以下各數是合法的八進制數:
015(十進制為13)0101(十進制為65)0177777(十進制為65535)。
2、十六進制整常數:十六進制整常數的前綴為0X或0x。其數碼取值為0~9,A~F或a~f。以下各數是合法的十六進制整常數:
0X2A(十進制為42)0XA0 (十進制為160)0XFFFF (十進制為65535)。
3、十進制整常數:十進制整常數沒有前綴。其數碼為0~9。以下各數是合法的十進制整常數:
237 -568 65535 1627
在程序中是根據前綴來區分各種進制數的。因此在書寫常數時不要把前綴弄錯造成結果不正確。
整型變數分類
1、基本型
類型說明符為int,根據計算機的內部字長和編譯器的版本,在內存中可能佔2或4個位元組(通常分別在16位機和32位機上),其取值為基本整常數。
2、短整型
類型說明符為short int或short,在內存中佔2個位元組,其取值為短整常數。
3、長整型
類型說明符為long int或long,在內存中佔4個位元組,其取值為長整常數。
4、無符號型
類型說明符為unsigned。它可以單獨使用代表unsigned int,也可以作為前綴,都表示無符號整數,即永遠為非負的整型變數,大於0的數據范圍約擴大為原來的2倍。各種無符號類型量所佔的內存空間位元組數與相應的有符號類型量相同。但由於省去了符號位,故不能表示負數。
㈧ c語言…………
這是我在網上看到的文章,適合你的。
一、什麼是對齊,以及為什麼要對齊:
1. 現代計算機中內存空間都是按照byte劃分的,從理論上講似乎對任何類型的變數的訪問可以從任何地址開始,但實際情況是在訪問特定變數的時候經常在特定的內存地址訪問,這就需要各類型數據按照一定的規則在空間上排列,而不是順序的一個接一個的排放,這就是對齊。
2. 對齊的作用和原因:各個硬體平台對存儲空間的處理上有很大的不同。一些平台對某些特定類型的數據只能從某些特定地址開始存取。其他平台可能沒有這種情況, 但是最常見的是如果不按照適合其平台的要求對數據存放進行對齊,會在存取效率上帶來損失。比如有些平台每次讀都是從偶地址開始,如果一個int型(假設為 32位)如果存放在偶地址開始的地方,那麼一個讀周期就可以讀出,而如果存放在奇地址開始的地方,就可能會需要2個讀周期,並對兩次讀出的結果的高低 位元組進行拼湊才能得到該int數據。顯然在讀取效率上下降很多。這也是空間和時間的博弈。
二、對齊的實現
通常,我們寫程序的時候,不需要考慮對齊問題。編譯器會替我們選擇適合目標平台的對齊策略。當然,我們也可以通知給編譯器傳遞預編譯指令而改變對指定數據的對齊方法。
但是,正因為我們一般不需要關心這個問題,所以因為編輯器對數據存放做了對齊,而我們不了解的話,常常會對一些問題感到迷惑。最常見的就是struct數據結構的sizeof結果,出乎意料。為此,我們需要對對齊演算法所了解。
對齊的演算法:
由於各個平台和編譯器的不同,現以本人使用的gcc version 3.2.2編譯器(32位x86平台)為例子,來討論編譯器對struct數據結構中的各成員如何進行對齊的。
設結構體如下定義:
struct A {
int a;
char b;
short c;
};
結構體A中包含了4位元組長度的int一個,1位元組長度的char一個和2位元組長度的short型數據一個。所以A用到的空間應該是7位元組。但是因為編譯器要對數據成員在空間上進行對齊。
所以使用sizeof(strcut A)值為8。
現在把該結構體調整成員變數的順序。
struct B {
char b;
int a;
short c;
};
這時候同樣是總共7個位元組的變數,但是sizeof(struct B)的值卻是12。
下面我們使用預編譯指令#pragma pack (value)來告訴編譯器,使用我們指定的對齊值來取代預設的。
#progma pack (2) /*指定按2位元組對齊*/
struct C {
char b;
int a;
short c;
};
#progma pack () /*取消指定對齊,恢復預設對齊*/
sizeof(struct C)值是8。
修改對齊值為1:
#progma pack (1) /*指定按1位元組對齊*/
struct D {
char b;
int a;
short c;
};
#progma pack () /*取消指定對齊,恢復預設對齊*/
sizeof(struct D)值為7。
對於char型數據,其自身對齊值為1,對於short型為2,對於int,float,double類型,其自身對齊值為4,單位位元組。
這裡面有四個概念值:
1)數據類型自身的對齊值:就是上面交代的基本數據類型的自身對齊值。
2)指定對齊值:#pragma pack (value)時的指定對齊值value。
3)結構體或者類的自身對齊值:其成員中自身對齊值最大的那個值。
4)數據成員、結構體和類的有效對齊值:自身對齊值和指定對齊值中較小的那個值。
有了這些值,我們就可以很方便的來討論具體數據結構的成員和其自身的對齊方式。有效對齊值N是最終用來決定數據存放地址方式的值,最重要。有效對齊N,就是表示「對齊在N上」,也就是說該數據的"存放起始地址%N=0".而數據結構中的數據變數都是按定義的先後順序來排放的。第一個數據變數的起始地址就是 數據結構的起始地址。結構體的成員變數要對齊排放,結構體本身也要根據自身的有效對齊值圓整(就是結構體成員變數佔用總長度需要是對結構體有效對齊值的整 數倍,結合下面例子理解)。這樣就不難理解上面的幾個例子的值了。
例子分析:
分析例子B;
struct B {
char b;
int a;
short c;
};
假設B從地址空間0x0000開始排放。該例子中沒有定義指定對齊值,在筆者環境下,該值默認為4。第一個成員變數b的自身對齊值是1,比指定或者默認指 定對齊值4小,所以其有效對齊值為1,所以其存放地址0x0000符合0x0000%1=0.第二個成員變數a,其自身對齊值為4,所以有效對齊值也為 4,所以只能存放在起始地址為0x0004到0x0007這四個連續的位元組空間中,復核0x0004%4=0,且緊靠第一個變數。第三個變數c,自身對齊 值為2,所以有效對齊值也是2,可以存放在0x0008到0x0009這兩個位元組空間中,符合0x0008%2=0。所以從0x0000到0x0009存 放的都是B內容。再看數據結構B的自身對齊值為其變數中最大對齊值(這里是b)所以就是4,所以結構體的有效對齊值也是4。根據結構體圓整的要求, 0x0009到0x0000=10位元組,(10+2)%4=0。所以0x0000A到0x000B也為結構體B所佔用。故B從0x0000到0x000B 共有12個位元組,sizeof(struct B)=12;
同理,分析上面例子C:
#pragma pack (2) /*指定按2位元組對齊*/
struct C {
char b;
int a;
short c;
};
#pragma pack () /*取消指定對齊,恢復預設對齊*/
第一個變數b的自身對齊值為1,指定對齊值為2,所以,其有效對齊值為1,假設C從0x0000開始,那麼b存放在0x0000,符合0x0000%1= 0;第二個變數,自身對齊值為4,指定對齊值為2,所以有效對齊值為2,所以順序存放在0x0002、0x0003、0x0004、0x0005四個連續 位元組中,符合0x0002%2=0。第三個變數c的自身對齊值為2,所以有效對齊值為2,順序存放
在0x0006、0x0007中,符合0x0006%2=0。所以從0x0000到0x00007共八位元組存放的是C的變數。又C的自身對齊值為4,所以 C的有效對齊值為2。又8%2=0,C只佔用0x0000到0x0007的八個位元組。所以sizeof(struct C)=8.
有 了以上的解釋,相信你對C語言的位元組對齊概念應該有了清楚的認識了吧。在網路程序中,掌握這個概念可是很重要的喔,在不同平台之間(比如在Windows 和Linux之間)傳遞2進制流(比如結構體),那麼在這兩個平台間必須要定義相同的對齊方式,不然莫名其妙的出了一些錯,可是很難排查的哦^_^。
本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/arethe/archive/2008/06/15/2548867.aspx
㈨ C語言中函數值為整型、中整型是什麼意思
通常泛指char、short int、int、long int、long long int這五種類型(包括signed和unsigned)以及_Bool類型。當然也包括編譯器作為擴展而實現的某些整型類型。
見C11標准:
[6.2.5-4]There are five standard signed integer types, designated as signed char, short int, int, long int, and long long int. (These and other types may be designated in several additional ways, as described in 6.7.2.) There may also be implementation-defined extended signed integer types. The standard and extended signed integer types are collectively called signed integer types.
[6.2.5-6]For each of the signed integer types, there is a corresponding (but different) unsigned integer type (designated with the keyword unsigned) that uses the same amount of storage (including sign information) and has the same alignment requirements. The type _Bool and the unsigned integer types that correspond to the standard signed integer types are the standard unsigned integer types. The unsigned integer types that correspond to the extended signed integer types are the extended unsigned integer types. The standard and extended unsigned integer types are collectively called unsigned integer types.