c++中有表示正无穷的数吗_阅读:贯穿编程人生CSAPP[2]信息表示
基本數據類型
讓我們復習一下C語言中基本數據類型的內存占用(單位為字節):
這其實是很基礎的知識,但是值得一提的是,表中只有兩個數據類型在32位和64位計算機中使用了不同的字節數,一個是long int,另一個是char *。其實不只是char *,任何數據類型的指針使用的字節數都和char *是一樣的,所以這里更好的寫法應該是type *。
為了盡量使程序可移植,要小心從32位到64位的變化。例如,在32位機器中使用int保存變量的地址可行,但同樣的程序移植到64位機器中就成了bug。所以不如嘗試用long int保存變量的地址。這個時候,上面的表格就體現出了它的價值。
大小端模式
對于多于一個字節的數據類型,在內存中有兩種存儲方式,以整型數0x01234567為例
大端模式將高位存放在低地址,而小端模式將高位存放在高地址。這對我們編程有什么影響呢?說實話,在我寫過的程序中并沒考慮過大小端模式,但在如下幾個方面,可以體現出大小端模式的影響。
大端機器與小端機器間的網絡通信。
很明顯,如果雙方都遵循先發低位再發高位的規則,發送前后數據在內存中的存儲方式是完全一致的,但大端機器和小端機器對同樣的數據存儲方式卻會解析出完全不同的結果,導致數據出錯。因此,解決辦法是發送前全部轉換成大端模式,對方接收后,再根據自己的機器類型轉換成大端或小端模式。實際中網絡通信也的確是這樣做的。
匯編可以看到真實數據順序。
比如
add %eax, 0x8049464經過匯編后得到的機器碼是
80483bd: 01 05 64 94 04 08操作數0x8049464被轉換成了小端模式下的結果64 94 04 08。
繞開類型系統的強制轉換。
如下代碼可以測試出機器是大端模式還是小端模式:
int value = 0x01234567;char *ch = (char *)(&value);
if (*ch == 0x01) {
//大端模式} else if (*ch == 0x67) {
//小端模式} else {
//其它}
由于ch一定指向value最低地址的字節,因此可以通過ch來判斷系統的大小端類型。
整型數范圍與C標準
本文最開始就給出了各個基本數據類型的字節數,根據字節數我們可以推斷出在采用二進制補碼編碼的情況下各個類型的表示范圍。比如說int的范圍為-2,147,483,648 ~ 2,147,483,647。但是C標準的存在卻提醒我們事實并非總是如此。
C標準規定的各類型整型數的范圍與其典型值有所不同,通常小于其典型值范圍,并且所有有符號類型只要求對稱范圍。例如,int只要求-32767 ~ 32767。雖然我們使用的編譯器會按照系統位數來決定int類型的實際范圍,但是,如果想要使代碼能夠跨平臺,最好按照C標準規定的范圍來設計自己的程序,這樣只要編譯器遵循C標準,代碼就一定不會出錯。否則,像int i = 99999;這樣的語句,放到16位計算機上就直接溢出了。
接下來提一個有趣的事情,在32位計算機的頭文件中,定義了各個基本數據類型的范圍,以整型為例
#define INT_MAX 2147483647#define INT_MIN (-INT_MAX-1)為什么最小值不直接寫#define INT_MIN -2147483648呢?
因為對編譯器來說,-2147483648是一個表達式,它的意思是對2147483648取負。但是2147483648這個數已經超出了整型數所能表示的范圍,因此這樣寫是沒有意義的。更詳細的解釋可以查看后面的參考資料。
復合型類型轉換——從short到unsigned
數據類型既有不同的范圍,又有不同的符號性質,當兩者同時轉換時,就需要多加注意。
例如,從short轉換到unsigned需要分兩步,實際過程相當于(unsigned)(int),而不是(unsigned)(unsigned short)。也就是說,先擴大范圍,再改變符號性質。對于下面的代碼
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);
打印結果u與u1都是4294954951,而u2是53191。
總結
以上是生活随笔為你收集整理的c++中有表示正无穷的数吗_阅读:贯穿编程人生CSAPP[2]信息表示的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 如何将网站数据导入服务器里,网站是无意识
- 下一篇: 急性肝损伤的症状
