C语言中signed和unsigned
- signed意思为有符号的,也就是第一个位代表正负,剩余的代表大小,例如:signed int 大小区间为-128-127
- unsigned意思为无符号的,所有的位都为大小,没有负数,例如:unsigned int 大小区间为:0-255
signed类型的整数,只用了去除最高位,剩下的15位来进行编码的,而最高位只是用来做标记(sign),标记整数的正负,0表示正,1表示负。所以对于signed的整数,的存储范围是(-2^15 to 2^15-1),也就是 -32768 到 +32767的整数。
unsigned的整数,其16位全部用来编码,存储范围便是(0 to 2^16-1),即 0到 65535 的非负整数。所以呢 你可以声明 int a = 1,或者 int a = -1, 但是不可以声明 unsigned a = -1 。但是需要提到的一点是,不管整数的类型是signed 还是 unsigned,都用了16位来存储,也就是说16位全部用来存储数据
那其实很多人对long
、long long
、unsigned long
的取值范围有疑惑,我也有,所以查阅解惑
int (long)
-
4字节8位可表达位数:2^32=42 9496 7296
-
范围:-21 4748 3648 ~ 21 4748 3647 (21*10^8)
unsigned int (unsigned long)
-
4字节8位可表达位数:2^32=42 9496 7296
-
范围:0 ~ 42 9496 7295 (42*10^8)
long long (__int64)
-
8字节8位可表达位数:2^64=1844 6744 0737 0960 0000
-
范围:-922 3372 0368 5477 5808 ~ 922 3372 0368 5477 5807 (922*10^16)
unsigned long (unsigned __int64)
-
8字节8位可表达位数:2^64=1844 6744 0737 0960 0000
-
范围:0 ~ 1844 6744 0737 0955 1615 (1844*10^16)
类型名称 | 字节数 | 取值范围 |
---|---|---|
signed char | 1 | -128~+127 |
short int | 2 | -32768~+32767 |
int | 4 | -2147483648~+2147483647 |
long int | 4 | -2147483648~+2141483647 |
long long long int | 8 | -9223372036854775808~+9223372036854775807 |
本文部分转载于两篇文章,做了微微整合
原文链接:https://blog.csdn.net/qq_40421919/article/details/83213527
https://www.cnblogs.com/lyxcode/p/9449466.html