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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言——整形数据的存储

發布時間:2025/3/21 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言——整形数据的存储 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

C語言——整形數據的存儲

  • 前言
  • 一、原反補碼
  • 二、大小端
    • 計算機對數據的存儲方式可分為大端存儲和小端存儲模式。
  • 三、整形的截斷與提升
      • 1.整形截斷
      • 2.整形提升
      • 舉例說明


前言

C語言中整形數據的存儲主要有三個重點。1、原反補碼 2、大小端 3、整形截斷和提升


一、原反補碼

原碼、反碼、補碼是計算機中對數字的二進制表示方法。

原碼:將最高位作為符號位(0表示正,1表示負),其它數字位代表數值本身的絕對值的數字表示方式。

反碼:如果是正數,則表示方法和原碼一樣;如果是負數,符號位不變,其余各位取反,則得到這個數字的反碼表示形式。

補碼:如果是正數,則表示方法和原碼一樣;如果是負數,則將數字的反碼加上1(相當于將原碼數值位取反然后在最低位加1 。
用八位二進制數舉個例子:

原碼反碼補碼
1000000010000000100000001
-1100000011111111011111111

那么為什么會有原反補碼存在呢? 原因是計算機只有加法器,沒有減法器。
在計算器中,所有的減法計算都必須用加法進行,通過被減數的補碼代替被減數,可以把減法轉變為加法運算。
用上例中的兩數相加試一試。
如果用原碼計算:

可以看到答案是-2,但這并不是正確的結果,因此聰明的計算機先驅們創造了補碼,利用補碼相加:

這樣一來,計算的答案就正確了!

二、大小端

計算機對數據的存儲方式可分為大端存儲和小端存儲模式。

采用大小模式對數據進行存放的主要區別在于在存放的字節順序,大端方式將高位存放在低地址,小端方式將低位存放在低地址。采用大端方式進行數據存放符合人類的正常思維,而采用小端方式進行數據存放利于計算機處理。到目前為止,采用大端或者小端進行數據存放,其孰優孰劣也沒有定論。

在一個處理器系統中,有可能存在大端和小端模式同時存在的現象。這一現象為系統的軟硬件設計帶來了不小的麻煩,因此,判斷系統到底是大端還是小段存儲是非常終于重要的。
設計一個函數判斷大小端:

代碼一: void bigorsmall() { int a = 1; char b = *(char*)&a; if(b==1)printf("小端\n") elseprintf("大端\n"); } 代碼二(利用聯合體判斷):int bigorsmall() {union{ int i;char c;}un;un.i = 1;return un.c; } 如果返回1,則說明是小端機,0則是大端機。

三、整形的截斷與提升

整形的截斷和提升是給整形賦值時可能會發生的事件。

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语言——整形数据的存储的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。