【C Primer Plus第六版中文】 課后習(xí)題 第三章 3.11編程練習(xí)(個(gè)人總結(jié)版)
(前言:,本文章由個(gè)人收集相關(guān)資料且撰寫(xiě)而成,初心是在學(xué)習(xí)中做筆記,供個(gè)人學(xué)習(xí)使用)?

1. 通過(guò)試驗(yàn)(即編寫(xiě)帶有此類(lèi)問(wèn)題的程序)觀察系統(tǒng)如何處理整數(shù)上溢、浮點(diǎn)數(shù)上溢以及浮點(diǎn)數(shù)下溢的情況
這三個(gè)樣例代碼會(huì)因?yàn)榫幾g器和計(jì)算機(jī)硬件的不同而有所不同,但基本概念和現(xiàn)象是相同的。
我用的是VS2022版本,64位windows系統(tǒng)
a.?整數(shù)上溢:

b.?浮點(diǎn)數(shù)上溢:

c. 浮點(diǎn)數(shù)下溢:

補(bǔ)充知識(shí)點(diǎn):
(一)
:
?1. **數(shù)據(jù)類(lèi)型大小**:不同硬件平臺(tái)上,數(shù)據(jù)類(lèi)型的大小可能會(huì)有所不同。例如,在32位系統(tǒng)上,整數(shù)數(shù)據(jù)類(lèi)型 int 通常為4字節(jié),而在64位系統(tǒng)上,它通常為8字節(jié)。如果在不同平臺(tái)上使用相同的代碼,但數(shù)據(jù)類(lèi)型大小不一致,可能會(huì)導(dǎo)致數(shù)據(jù)溢出。
?2. **字節(jié)序**:計(jì)算機(jī)硬件有兩種字節(jié)序,即大端序和小端序。大端序是將高位字節(jié)存儲(chǔ)在低地址,小端序是將低位字節(jié)存儲(chǔ)在低地址。如果代碼在一個(gè)平臺(tái)上按照一種字節(jié)序編寫(xiě),然后在另一個(gè)平臺(tái)上運(yùn)行,可能會(huì)導(dǎo)致數(shù)據(jù)在存儲(chǔ)和讀取時(shí)順序不一致,從而導(dǎo)致數(shù)據(jù)溢出。
?3. **浮點(diǎn)數(shù)精度**:不同硬件平臺(tái)上的浮點(diǎn)數(shù)運(yùn)算可能有不同的精度。例如,一些平臺(tái)上使用 IEEE 754 標(biāo)準(zhǔn)來(lái)表示浮點(diǎn)數(shù),而另一些平臺(tái)可能使用其他方法。如果代碼在一個(gè)平臺(tái)上進(jìn)行了浮點(diǎn)數(shù)運(yùn)算,然后在另一個(gè)平臺(tái)上運(yùn)行,可能會(huì)導(dǎo)致精度丟失,從而導(dǎo)致數(shù)據(jù)溢出。
?4. **處理器指令集**:不同的處理器可能支持不同的指令集和指令集擴(kuò)展。如果代碼使用了特定平臺(tái)上的特殊指令或指令集擴(kuò)展,但在其他平臺(tái)上并不支持,可能會(huì)導(dǎo)致代碼運(yùn)行時(shí)出現(xiàn)錯(cuò)誤或數(shù)據(jù)溢出。
?5. **硬件架構(gòu)**:不同硬件架構(gòu)的處理器可能有不同的尋址空間和內(nèi)存管理方式。如果代碼假設(shè)特定硬件架構(gòu)的內(nèi)存地址分布,但在其他硬件架構(gòu)上運(yùn)行,可能會(huì)導(dǎo)致內(nèi)存訪(fǎng)問(wèn)錯(cuò)誤,從而導(dǎo)致數(shù)據(jù)溢出。
?綜上所述,計(jì)算機(jī)硬件在數(shù)據(jù)類(lèi)型大小、字節(jié)序、浮點(diǎn)數(shù)精度、處理器指令集和硬件架構(gòu)等方面的差異可能導(dǎo)致代碼數(shù)據(jù)溢出的不同情況。因此,在開(kāi)發(fā)跨平臺(tái)的代碼時(shí),需要特別注意這些差異,以確保代碼在不同硬件平臺(tái)上都能正確運(yùn)行,并避免數(shù)據(jù)溢出等問(wèn)題。
(二)
解:浮點(diǎn)數(shù)上溢時(shí)輸出結(jié)果為 "inf" 是因?yàn)楦↑c(diǎn)數(shù)的表示范圍是有限的,當(dāng)一個(gè)浮點(diǎn)數(shù)的絕對(duì)值超過(guò)了它所能表示的最大值時(shí),它就會(huì)變成正無(wú)窮或負(fù)無(wú)窮,用字符串表示為 "inf" 或 "-inf"。
?在C語(yǔ)言中,浮點(diǎn)數(shù)上溢的情況通常用 IEEE 754 標(biāo)準(zhǔn)中定義的特殊值來(lái)表示,它表示無(wú)窮大。IEEE 754 標(biāo)準(zhǔn)規(guī)定,當(dāng)一個(gè)浮點(diǎn)數(shù)的指數(shù)部分超過(guò)浮點(diǎn)數(shù)表示范圍時(shí),這個(gè)浮點(diǎn)數(shù)就被認(rèn)為是無(wú)窮大。
?在例子中,我們將一個(gè)很大的浮點(diǎn)數(shù) `3.4e38` 乘以2,這超過(guò)了浮點(diǎn)數(shù)表示范圍,因此結(jié)果變成了正無(wú)窮,用字符串 "inf" 來(lái)表示。實(shí)際上,"inf" 是一個(gè)特殊的浮點(diǎn)數(shù)值,代表正無(wú)窮大。
?需要注意的是,由于計(jì)算機(jī)對(duì)浮點(diǎn)數(shù)的表示是近似的,所以正無(wú)窮也可能用其他表示形式,例如 "INF" 或 "Infinity",具體表現(xiàn)取決于編譯器和計(jì)算機(jī)系統(tǒng)的不同。但無(wú)論如何,它們都代表了浮點(diǎn)數(shù)上溢的情況。
2. 編寫(xiě)一個(gè)程序,要求提示輸入一個(gè)ASCII碼值(如66),然后打印輸入的字符。

3. 編寫(xiě)一個(gè)程序,發(fā)出一聲警報(bào),然后打印下面的文本:
Startled by the sudden sound, sally shouted,
“By the Great Pumpkin, what was that!”
目的就在于簡(jiǎn)單使用蜂鳴警報(bào) \a

4. 編寫(xiě)一個(gè)程序,讀取一個(gè)浮點(diǎn)數(shù),先打印成小數(shù)點(diǎn)形式,再打印成指數(shù)形式。然后如果系統(tǒng)支持,再打印成p計(jì)數(shù)法(即十六進(jìn)制計(jì)數(shù)法)。

:
#include <stdio.h>
int main() {
??? double num;
??? printf("請(qǐng)輸入一個(gè)浮點(diǎn)數(shù):");
??? scanf("%lf", &num);
??? // 打印成小數(shù)點(diǎn)形式
??? printf("小數(shù)點(diǎn)形式:%f\n", num);
??? // 打印成指數(shù)形式
??? printf("指數(shù)形式:%e\n", num);
??? // 打印成p計(jì)數(shù)法(十六進(jìn)制計(jì)數(shù)法)
??? printf("p計(jì)數(shù)法:%a\n", num);
??? return 0;
}
5. 一年大約有3.156×107秒。編寫(xiě)一個(gè)程序,提示用戶(hù)輸入年齡,然后顯示改年齡對(duì)應(yīng)的秒數(shù)。

這是我編寫(xiě)的相關(guān)代碼,經(jīng)過(guò)AI修改后,下方為修改補(bǔ)充的代碼。

在使用 scanf_s
函數(shù)時(shí),需要指定 %d
的寬度為 sizeof(ages)
,因?yàn)?scanf_s
是安全的輸入函數(shù),需要確保輸入的數(shù)據(jù)不會(huì)導(dǎo)致緩沖區(qū)溢出。
6. ?1個(gè)水分子的質(zhì)量約為3.0×10-23克。1夸脫水大約是950克。編寫(xiě)一個(gè)程序,提示用戶(hù)輸入水的夸脫數(shù),并顯示水分子的數(shù)量。

7. ?1英寸相當(dāng)于2.54厘米。編寫(xiě)一個(gè)程序,提示用戶(hù)輸入身高(/英寸),然后以厘米為單位顯示身高。

8. 在美國(guó)的體積測(cè)量系統(tǒng)中,1品脫等于2杯,1杯等于8盎司,1盎司等于2大湯勺,1大湯勺等于3茶勺。編寫(xiě)一個(gè)程序,提示用戶(hù)輸入杯數(shù),并以品脫、盎司、湯勺、茶勺為單位顯示等價(jià)容量。(思考對(duì)于該程序,為何使用浮點(diǎn)類(lèi)型更合適?)
