Ⅰ 關於c語言數據類型的問題
long long hello = 1 + 2147483647;
cout <宏舉< hello << endl;
cout << INT_MAX << endl;
hello右邊表達式 是1 + int 最大值。 因為右邊沒什麼信心表明是long long 類型參與計算,他們直接當做是int + int的計算,因辯禪此計算結果放入到的int類型的空間蔽灶碧存儲;但是超過了int類型最大值, 所以右邊變數的int值變成負的int值 了,能後再賦值給 long long類型的hello。so.....
long long hello = 1LL + 2147483647;
cout << hello << endl;
cout << INT_MAX << endl;
如果這樣呢,在計算右邊表達式編譯器知道 long long類型參與計算了,因此它把加的結果放到了long long空間中, 能後再賦值給long long類型的hello.
Ⅱ C語言中實數型數據的「有效數據」是什麼意思
就是說 實型豎運數據的值仿畝 並不是精確的值,有一定的精確度余大梁。
例如
1這個數
用float保存的時候,可能是
0.999999
也可能是
1.000001
Ⅲ 關於C語言的數據類型的問題
這3個問題其實只是1個問題。知道printf中的輸出格式控制符是獨立於輸出變數類型的就都解釋清楚了,比如說格式控制符%ld是把對應的變數的「值」當作長整型來輸出,而不管這對應的變數本來的類型是什麼。所以:
①錯:因為它會把一個較大的無符號數作為負數列印出來,比如
unsigned a=4294967290;
printf("%ld\n",a);
則輸出是-6。
②對:因為C在內部計算浮點數時都是按double型操作的,只在輸出時取不同精度。這里有個問題要明白,「精度」與輸出小數點後位數並不是一回事,一個float變數同樣可以由%.xf中的x控制輸出10位、20位小數,但由於「精度」已被截斷為6位,那麼後續的數字就不可靠了……
③錯:整型數是按補碼存放的,浮點數是按階碼加尾數原碼存放的,所以在%f控制下會把整型數補碼值按「階碼加尾數原碼」對待,輸出自然是錯誤的。
Ⅳ C語言的數據類型問題
1/2是求商返畢州,1和2都是整型,兩個做求商結果為0。因為a是float型,0會隱式轉換成0。000000
當式子為1.0/2 或者1/2.0時,表達式中有浮點數,這樣在計算之前編譯器會隱漏蔽式的把短位元組的類型轉換為長位元組類型,(在有些編譯器中int可能只佔2個位元組)。所以這兩個表達式實際數運上都是在計算1.0/2.0。因為結果也是浮點數,結果就不存在取商的說法了。所以結果是0.50000
Ⅳ C語言類型問題
int和float在內睜散存滲早或中存儲結構是叢伍不一樣的
http://blog.csdn.net/chlaws/archive/2007/12/13/1933274.aspx
Ⅵ c語言關於數據類型的問題
數據類型轉換分自動轉換和強制轉換兩類。
1)自動轉換:這類轉換由C編譯系統自動完成;其原則是保證數據的精度不降低,所以,數據轉換按數據存儲長度增長的方向進行。
例如:你上面的題:
char w;int x;float y,z;
則表達式w*x+z-y的結果是什麼類型.
解析過程:這是按照自動轉換規則進行的因為char在內存中佔1個位元組,int占 2個位元組,float占 4個位元組
所以:表達式w*x+z-y的結果是float
至於你書說上說float類型在計算時要先轉換成double類型,才能計算,結果是double類型,但問題是你上面的題沒有提到double類型!
2)強制轉換:將結果轉換為自己所希望的數據類型。形式為尺源:
(類型名)(表達式)——即可拿山將表達式的類型轉換為指定的(類型名)
說明:強制轉換只對本次運算有效,並不改變變數本身定義時所規定的類型。
例如:float x = 4;int y = 2;
進行運算:(int)x / y 其結陵敏態果為2;但運算後x的類型仍為實型,而不會變成int型。
Ⅶ C語言數據類型問題
首先搞清楚計算機是用二進制存儲形式存儲內容的,一個位元組是8個二進制飢正肢位。一個float、double、long double類型即單精度浮點類型、雙精度浮點類型和長雙精度浮點類型在32位系統下面的存儲空間分別為4位元組、8位元組和12位元組,也就是32個二進制位、64個二進制位和96個二進制爛世位,因此他們能保存的小數點後面的位數的能力也是大相徑庭的,位數越多能保存的小清頌數點後面的位數也就越多,位數不夠保存不了的計算機會自動舍棄後面幾位!
Ⅷ C語言數據類型有效數字問題
1、long
int
的有效位是32位,double的有效位是15~16位。長整型與double型運算時磨慧賀要一律轉換成double的原因是:double所存的數的范圍,比long
int
要大得多。而且,因為計算機存儲方式的原因,整型和浮點型是不能直接運算的。兩個小一點的數運算,不論怎麼轉換,對結果都沒有影響,但是如果是一個比較小的數,和一個很大的數運算,當然是省略小的比較精確。
2雖然兩個數都能用float
存儲,但是他們的結果的有效數字是大於float的存儲范圍,在運算時只允許結果小於7位的有瞎派效數碧差參加運算,也就是說,不是每位數都能參加運算。如果換成double每位數都能參加運算,雖然最後的有效位是一樣的,但是精度卻提高了。尤其當結果還是一個比較大的數時。
Ⅸ c語言數據類型問題
1.概述
C 語言包含的數據類型如下圖所示:
2.各種數據類型介紹
2.1整型
整形包括短整型、整形和長整形。
2.1.1短整形
short a=1;
2.1.2整形
一般佔4個位元組(32位),最高位代表符號,0表示正數,1表示負數,取值范圍是-2147483648~2147483647,在內存中的存儲順序是地位在前、高位在後,例如0x12345678在內存中的存儲如下:
地址:
數據:78563412
定義:用int關鍵字,舉例如下:
int a=6;
2.1.3長整形
long a=10;
2.2浮點型
浮點型包括單精度型和雙精度型。
2.2.1單精度型
浮點型,又稱實型,也稱單精度。一般佔4個位元組(32位),
float a=4.5;
地址:
數據:00009040
2.2.2雙精度型
一般佔8個位元組(64位)
double a=4.5;
地址:
數據:0000000000001240
2.3字元類型
在各種不同系統中,字元類型都佔一個位元組(8位)。定義如下:
char c='a';
也可以用字元對應的ASCII碼賦值,如下:
char c=97;
3.數據類型與「模子」 short、int、long、char、float、double 這六個關鍵字代表C 語言里的六種基本數據類型。 怎麼去理解它們呢? 舉個例子:見過藕煤球的那個東西吧?(沒見過?煤球總見過吧)。那個東西叫藕煤器,拿著它在和好的煤堆里這么一咔,一個煤球出來了。半徑12cm,12 個孔。不同型號的藕煤器咔出來的煤球大小不一樣,孔數也不一樣。這個藕煤器其實就是個模子。 現在我們聯想一下,short、int、long、char、float、double 這六個東東是不是很像不同類型的藕煤器啊?拿著它們在內存上咔咔咔,不同大小的內存就分配好了,當然別忘了給它們取個好聽的名字。 在32 位的系統上short 咔出來的內存大小是2 個byte; int 咔出來的內存大小是4 個byte; long 咔出來的內存大小是4 個byte; float 咔出來的內存大小是4 個byte; double 咔出來的內存大小是8 個byte; char 咔出來的內存大小是1 個byte。 (注意這里指一般情況,可能不同的平台還會有所不同,具體平台可以用sizeof 關鍵字測試一下) 很簡單吧?咔咔咔很爽吧?是很簡單,也確實很爽,但問題就是你咔出來這么多內存塊,你總不能給他取名字叫做x1,x2,x3,x4,x5…或者長江1 號,長江2 號…吧。它們長得這么像(不是你家的老大,老二,老三…),過一陣子你就會忘了到底哪個名字和哪個內存塊匹配了(到底誰嫁給誰了啊?^_^)。所以呢,給他們取一個好的名字絕對重要。下面我們就來研究研究取什麼樣的名字好。 4.變數的命名規則 1)命名應當直觀且可以拼讀,可望文知意,便於記憶和閱讀。 標識符最好採用英文單詞或其組合,不允許使用拼音。程序中的英文單詞一般不要太復雜,用詞應當准確。 2)命名的長度應當符合「min-length && max-information」原則。 C 是一種簡潔的語言, 命名也應該是簡潔的。例如變數名MaxVal 就比MaxValueUntilOverflow 好用。標識符的長度一般不要過長,較長的單詞可通過去掉「母音」形成縮寫。 另外,英文詞盡量不縮寫,特別是非常用專業名詞,如果有縮寫,在同一系統中對同一單詞必須使用相同的表示法,並且註明其意思。 3)當標識符由多個片語成時,每個詞的第一個字母大寫,其餘全部小寫。比如: int CurrentVal; 這樣的名字看起來比較清晰,遠比一長串字元好得多。 4)盡量避免名字中出現數字編號,如Value1,Value2 等,除非邏輯上的確需要編號。比如驅動開發時為管腳命名,非編號名字反而不好。 初學者總是喜歡用帶編號的變數名或函數名,這樣子看上去很簡單方便,但其實是一顆顆定時炸彈。這個習慣初學者一定要改過來。 5)對在多個文件之間共同使用的全局變數或函數要加范圍限定符(建議使用模塊名(縮寫)作為范圍限定符)。 (GUI_ ,etc)標識符的命名規則: 6)標識符名分為兩部分:規范標識符前綴(後綴) + 含義標識。非全局變數可以不用使用范圍限定符前綴。
7)作用域前綴命名規則。
8)數據類型前綴命名規則。
9)含義標識命名規則,變數命名使用名詞性片語,函數命名使用動詞性片語。例如:
變數含義標識符構成:目標詞+ 動詞(的過去分詞)+ [狀語] + [目的地];
函數含義標識符構成:動詞(一般現時)+目標詞+[狀語]+[目的地]; 10)程序中不得出現僅靠大小寫區分的相似的標識符。例如: int x, X; 變數x 與X 容易混淆 void foo(int x); 函數foo 與FOO 容易混淆 void FOO(float x); 這里還有一個要特別注意的就是1(數字1)和l(小寫字母l)之間,0(數字0)和o(小寫字母o)之間的區別。這兩對真是很難區分的,我曾經的一個同事就被這個問題折騰了一次。 11)一個函數名禁止被用於其它之處。例如: #include "c_standards.h" void foo(int p_1) { int x = p_1; } void static_p(void) { int foo = 1u; } 12)所有宏定義、枚舉常數、只讀變數全用大寫字母命名,用下劃線分割單詞。例如: const int MAX_LENGTH = 100; //這不是常量,而是一個只讀變數,具體請往後看 #define FILE_PATH 「/usr/tmp」 13)考慮到習慣性問題,局部變數中可採用通用的命名方式,僅限於n、i、j 等作為循環變數使用。 一定不要寫出如下這樣的代碼: int p; char i; int c; char * a; 一般來說習慣上用n,m,i,j,k 等表示int 類型的變數;c,ch 等表示字元類型變數;a 等表示數組;p 等表示指針。當然這僅僅是一般習慣,除了i,j,k 等可以用來表示循環變數外,別的字元變數名盡量不要使用。 14)定義變數的同時千萬千萬別忘了初始化。定義變數時編譯器並不一定清空了這塊內存,它的值可能是無效的數據。這個問題在內存管理那章有非常詳細的討論,請參看。 15)不同類型數據之間的運算要注意精度擴展問題,一般低精度數據將向高精度數據擴展。
Ⅹ c語言中的float數據類型的有效數字為什麼是6~7位
float數據 機碼巧器內是2進制數, 1位符號位 8位指數位 23位「尾數」位 共32 位 2進制數。 平時講 有效數字 是6~7位 ,指10進制。 通常程序輸入的數是10進制,進入磨模局機器後要化成2進制,計算完又轉十進制輸出。 10進制到2進制,2進制到10進制瞎讓 轉換,有的數化不凈,有的數化得凈。 如同10進制分數化10進制小數,有的化得凈(例如 4分之1,變0.25),有的化不凈(例如 3分之1,變0.33333....)。 10進制到2進制,2進制到10進制 轉換,化得凈的效數字7位,化不凈的效數字6位,因為最後一位有舍入誤差。 例如: float x,y; x=0.51; // 化不凈 y=0.5; // 化得凈 printf("x=%.8f y=%.8",x,y); // 輸出 0.50999999 0.50000000