日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

c++中有表示正无穷的数吗_阅读:贯穿编程人生CSAPP[2]信息表示

發(fā)布時間:2024/9/19 c/c++ 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c++中有表示正无穷的数吗_阅读:贯穿编程人生CSAPP[2]信息表示 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

基本數(shù)據(jù)類型

讓我們復習一下C語言中基本數(shù)據(jù)類型的內(nèi)存占用(單位為字節(jié)):

這其實是很基礎的知識,但是值得一提的是,表中只有兩個數(shù)據(jù)類型在32位和64位計算機中使用了不同的字節(jié)數(shù),一個是long int,另一個是char *。其實不只是char *,任何數(shù)據(jù)類型的指針使用的字節(jié)數(shù)都和char *是一樣的,所以這里更好的寫法應該是type *。

為了盡量使程序可移植,要小心從32位到64位的變化。例如,在32位機器中使用int保存變量的地址可行,但同樣的程序移植到64位機器中就成了bug。所以不如嘗試用long int保存變量的地址。這個時候,上面的表格就體現(xiàn)出了它的價值。

大小端模式

對于多于一個字節(jié)的數(shù)據(jù)類型,在內(nèi)存中有兩種存儲方式,以整型數(shù)0x01234567為例

大端模式將高位存放在低地址,而小端模式將高位存放在高地址。這對我們編程有什么影響呢?說實話,在我寫過的程序中并沒考慮過大小端模式,但在如下幾個方面,可以體現(xiàn)出大小端模式的影響。

大端機器與小端機器間的網(wǎng)絡通信。

很明顯,如果雙方都遵循先發(fā)低位再發(fā)高位的規(guī)則,發(fā)送前后數(shù)據(jù)在內(nèi)存中的存儲方式是完全一致的,但大端機器和小端機器對同樣的數(shù)據(jù)存儲方式卻會解析出完全不同的結(jié)果,導致數(shù)據(jù)出錯。因此,解決辦法是發(fā)送前全部轉(zhuǎn)換成大端模式,對方接收后,再根據(jù)自己的機器類型轉(zhuǎn)換成大端或小端模式。實際中網(wǎng)絡通信也的確是這樣做的。

匯編可以看到真實數(shù)據(jù)順序。

比如

add %eax, 0x8049464

經(jīng)過匯編后得到的機器碼是

80483bd: 01 05 64 94 04 08

操作數(shù)0x8049464被轉(zhuǎn)換成了小端模式下的結(jié)果64 94 04 08。

繞開類型系統(tǒng)的強制轉(zhuǎn)換。

如下代碼可以測試出機器是大端模式還是小端模式:

int value = 0x01234567;
char *ch = (char *)(&value);
if (*ch == 0x01) {
//大端模式} else if (*ch == 0x67) {
//小端模式} else {
//其它}

由于ch一定指向value最低地址的字節(jié),因此可以通過ch來判斷系統(tǒng)的大小端類型。

整型數(shù)范圍與C標準

本文最開始就給出了各個基本數(shù)據(jù)類型的字節(jié)數(shù),根據(jù)字節(jié)數(shù)我們可以推斷出在采用二進制補碼編碼的情況下各個類型的表示范圍。比如說int的范圍為-2,147,483,648 ~ 2,147,483,647。但是C標準的存在卻提醒我們事實并非總是如此。

C標準規(guī)定的各類型整型數(shù)的范圍與其典型值有所不同,通常小于其典型值范圍,并且所有有符號類型只要求對稱范圍。例如,int只要求-32767 ~ 32767。雖然我們使用的編譯器會按照系統(tǒng)位數(shù)來決定int類型的實際范圍,但是,如果想要使代碼能夠跨平臺,最好按照C標準規(guī)定的范圍來設計自己的程序,這樣只要編譯器遵循C標準,代碼就一定不會出錯。否則,像int i = 99999;這樣的語句,放到16位計算機上就直接溢出了。

接下來提一個有趣的事情,在32位計算機的頭文件中,定義了各個基本數(shù)據(jù)類型的范圍,以整型為例

#define INT_MAX 2147483647#define INT_MIN (-INT_MAX-1)

為什么最小值不直接寫#define INT_MIN -2147483648呢?

因為對編譯器來說,-2147483648是一個表達式,它的意思是對2147483648取負。但是2147483648這個數(shù)已經(jīng)超出了整型數(shù)所能表示的范圍,因此這樣寫是沒有意義的。更詳細的解釋可以查看后面的參考資料。

復合型類型轉(zhuǎn)換——從short到unsigned

數(shù)據(jù)類型既有不同的范圍,又有不同的符號性質(zhì),當兩者同時轉(zhuǎn)換時,就需要多加注意。

例如,從short轉(zhuǎn)換到unsigned需要分兩步,實際過程相當于(unsigned)(int),而不是(unsigned)(unsigned short)。也就是說,先擴大范圍,再改變符號性質(zhì)。對于下面的代碼

short s = -12345;
unsigned u = s;
printf("%u\n", u);
unsigned u1 = (unsigned)(int) s;
printf("%u\n", u1);
unsigned u2 = (unsigned)(unsigned short) s;
printf("%u\n", u2);

打印結(jié)果u與u1都是4294954951,而u2是53191。

總結(jié)

以上是生活随笔為你收集整理的c++中有表示正无穷的数吗_阅读:贯穿编程人生CSAPP[2]信息表示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。