c語言中int,c語言signed char,C語言 1字節signed char的范圍為什么是-128~127?

 2023-12-25 阅读 86 评论 0

摘要:參考c語言中int、無符號單字節范圍無符號單字節unsigned char位寬是8bit,范圍[0, 1111 1111b],也就是[0, 255]。有符號單字節范圍有符號單字節signed char位寬也是8bit,絕對值范圍也是[0, 1111 1111b],不過最高位表示符號位,能表示的范圍是

參考

c語言中int、無符號單字節范圍

無符號單字節unsigned char位寬是8bit,范圍[0, 1111 1111b],也就是[0, 255]。

有符號單字節范圍

有符號單字節signed char位寬也是8bit,絕對值范圍也是[0, 1111 1111b],不過最高位表示符號位,能表示的范圍是多少呢?

不得不考慮一個特殊情況,0加符號位可表示+0,-0。而在早期計算機存儲不夠時,用2個不同的補碼(±0)表示數學上的同一個0,是一種浪費,故規定-0表示為-128。

這樣,[-127, 127](補碼:[1000 0001b, 0111 1111b])就沒有爭議。

我們知道,

-128 = -127 - 1,那么,補碼=1000 0001b - 1b = 1000 0000b ,最高位1,符號位未變;

128 = 127 + 1,那么,有兩種情況

1)反碼+1到補碼符號位改變,補碼=0111 1111b + 1b = 1000 0000b,最高位1,與-128補碼相同。

2)反碼+1到補碼符號位不可變,補碼=0111 1111b + 1b = 0000 0000b, 最高位為0,與+0補碼相同。 (不符合溢出特點,因為+0不是最小的數,最大的數溢出后一般成為最小的數,舍)

由此,+128(若存在)及-128的補碼,和-0原碼是一樣的。

那么,-128在計算機中實際上是如何用單字節存儲的?

下面做實驗驗證,思路:用單字節signed char存儲,然后直接debug查看存儲的二進制值。

(調試環境:IDE Eclipse Photon,編譯器:Cygwin GCC)

#include

int main()

{

signed char a = -128;

signed char a2= -127;

signed char a3 = 128;

int na = sizeof(a);

int na2 = sizeof(a2);

int na3 = sizeof(a2);

printf("a=%d , size=%d\n", a, na);

printf("a2=%d , size=%d\n", a2, na2);

printf("a3=%d , size=%d\n", a3, na3);

a --;

a2 --;

a3 ++;

printf("a=%d , size=%d\n", a, na);

printf("a2=%d , size=%d\n", a2, na2);

printf("a3=%d , size=%d\n", a3, na3);

return 0;

}

可以發現,

a=-128 (Decimal)= 1000 0000 (Binary)

a=-127 (Decimal)= 1000 0001 (Binary)

a=+128 (Decimal),但計算機存儲值=-128(Decimal)=1000 0000 (Binary)

f985f5a987766a6b22d62ac142dfa05c.png

a, a2, a3自減1后,

a = 0111 1111(Binary) = 127 (Decimal)

a2 = 1000 0000(Binary) = -128(Decimal)

a3 = -127(Decimal)

ee91f439867b7da998c83a88cd7a902e.png

對應Console輸出

203f222c57606723fefd0f196fb75864.png

小結

1. 計算機中,C語言有符號單字節表示范圍[-128, 127]

2. 無法直接存儲128,會轉換為-128

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/196865.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息