C语言——整形数据的存储
C語言——整形數據的存儲
- 前言
- 一、原反補碼
- 二、大小端
- 計算機對數據的存儲方式可分為大端存儲和小端存儲模式。
- 三、整形的截斷與提升
- 1.整形截斷
- 2.整形提升
- 舉例說明
前言
C語言中整形數據的存儲主要有三個重點。1、原反補碼 2、大小端 3、整形截斷和提升
一、原反補碼
原碼、反碼、補碼是計算機中對數字的二進制表示方法。
原碼:將最高位作為符號位(0表示正,1表示負),其它數字位代表數值本身的絕對值的數字表示方式。
反碼:如果是正數,則表示方法和原碼一樣;如果是負數,符號位不變,其余各位取反,則得到這個數字的反碼表示形式。
補碼:如果是正數,則表示方法和原碼一樣;如果是負數,則將數字的反碼加上1(相當于將原碼數值位取反然后在最低位加1 。
用八位二進制數舉個例子:
| 1 | 00000001 | 00000001 | 00000001 |
| -1 | 10000001 | 11111110 | 11111111 |
那么為什么會有原反補碼存在呢? 原因是計算機只有加法器,沒有減法器。
在計算器中,所有的減法計算都必須用加法進行,通過被減數的補碼代替被減數,可以把減法轉變為加法運算。
用上例中的兩數相加試一試。
如果用原碼計算:
可以看到答案是-2,但這并不是正確的結果,因此聰明的計算機先驅們創造了補碼,利用補碼相加:
這樣一來,計算的答案就正確了!
二、大小端
計算機對數據的存儲方式可分為大端存儲和小端存儲模式。
采用大小模式對數據進行存放的主要區別在于在存放的字節順序,大端方式將高位存放在低地址,小端方式將低位存放在低地址。采用大端方式進行數據存放符合人類的正常思維,而采用小端方式進行數據存放利于計算機處理。到目前為止,采用大端或者小端進行數據存放,其孰優孰劣也沒有定論。
在一個處理器系統中,有可能存在大端和小端模式同時存在的現象。這一現象為系統的軟硬件設計帶來了不小的麻煩,因此,判斷系統到底是大端還是小段存儲是非常終于重要的。
設計一個函數判斷大小端:
三、整形的截斷與提升
整形的截斷和提升是給整形賦值時可能會發生的事件。
1.整形截斷
| 效果 | 截取低位的數據,舍棄高位數據 |
2.整形提升
| 效果 | 1.無符號數->向多出的高位補0 ----------------- 2.有符號數->補符號位 |
舉例說明
整形截斷 int main() {unsigned char a = 200;unsigned char b = 100;unsigned char c = 0;c = a + b;printf(“%d ”, c);return 0; }上面代碼的輸出結果是44。原因是由于200+100=300,但無符號char型的最大值是255,300的二進制數是100101100此時傳值就會發生截斷,舍棄最高位的1,剩下的低八位就是44了。
整形提升int main() { char a = -128; printf("%u\n",a); return 0; }上面代碼的輸出結果如下
這里為什么會輸出一個這么大的數字呢,我們把它轉換成二進制看看,轉換成二進制的結果是11111111 11111111 11111111 10000000,可以看到前面那么多1的原因應該是進行了補位。
這就是整形提升的效果,來分析一下這段代碼。
這里給a賦值的第一步首先進行了整形截斷,-128的二進制是110000000,補碼是110000000,截斷后變成10000000(8位二進制數)。
然后需要%u打印時就要進行整形提升到32位,補充符號位后就變成了11111111 11111111 11111111 10000000,因此就能理解輸出結果為什么這樣了。
總結
以上是生活随笔為你收集整理的C语言——整形数据的存储的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言之动态内存管理与动态内存函数
- 下一篇: C语言——程序的编译+链接(linux+