char类型的取值范围
2017-07-25 22:05
363 查看
所有的C语言的书籍里都会告诉你signed char的取值范围为-128 ~ 127,但是从来没有人告诉你为什么会是这样;
我们先来算算,有符号的char占一个字节,最高位表示正负,其余的七位表示数值,七位二进制可以表示128个数(2^7 = 128),即0~127;加上符号位后,就变成了-127 ~ -0,0 ~127,这时,就会出现‘-0’这样一朵奇葩;
我对网上关于-0和-128原码相同的这种说法表示很无语;
我们知道,计算机是以补码的形式存数据的;
-0和-128在计算机中是怎样存的?
所以,-128和-0的原码是不一样的;
但是,我们的char类型是8位,它把-128最高位符号位截掉了,这样-128的原码就变成了1000 0000;
被截短的-128的原码才和-0的原码相等;
既然都说到这里了,终于可以不提‘-0’这个恶心的东西了,今后看到一个有符号的char,它的原码用二进制表示为1000 0000的时候,我们就把它当做-128就可以了(只是看做,-128的原码可不是1000 0000);
下面,我们来看一下这个程序:
它会打印127,为什么?
-129 = -128 -1;因为计算机只会算加法,所以转换成-128 + (-1)
-
-128 原码: 1000 0000
反码: 0111 1111
补码: 1000 0000
-1 原码: 1000 0001
反码: 1111 1110
补码: 1111 1111
-128 + (-1)
1 0 0 0 0 0 0 0
+ 1 1 1 1 1 1 1 1
---------------------------
1 0 1 1 1 1 1 1 1
因为a是一个char类型的,所以,会打印127,这只是研究阶段,但请不要这样使用!
参考自:http://www.embedu.org/Column/Column771.htm
我们先来算算,有符号的char占一个字节,最高位表示正负,其余的七位表示数值,七位二进制可以表示128个数(2^7 = 128),即0~127;加上符号位后,就变成了-127 ~ -0,0 ~127,这时,就会出现‘-0’这样一朵奇葩;
我对网上关于-0和-128原码相同的这种说法表示很无语;
我们知道,计算机是以补码的形式存数据的;
-0和-128在计算机中是怎样存的?
所以,-128和-0的原码是不一样的;
但是,我们的char类型是8位,它把-128最高位符号位截掉了,这样-128的原码就变成了1000 0000;
被截短的-128的原码才和-0的原码相等;
既然都说到这里了,终于可以不提‘-0’这个恶心的东西了,今后看到一个有符号的char,它的原码用二进制表示为1000 0000的时候,我们就把它当做-128就可以了(只是看做,-128的原码可不是1000 0000);
下面,我们来看一下这个程序:
它会打印127,为什么?
-129 = -128 -1;因为计算机只会算加法,所以转换成-128 + (-1)
-
-128 原码: 1000 0000
反码: 0111 1111
补码: 1000 0000
-1 原码: 1000 0001
反码: 1111 1110
补码: 1111 1111
-128 + (-1)
1 0 0 0 0 0 0 0
+ 1 1 1 1 1 1 1 1
---------------------------
1 0 1 1 1 1 1 1 1
因为a是一个char类型的,所以,会打印127,这只是研究阶段,但请不要这样使用!
参考自:http://www.embedu.org/Column/Column771.htm
相关文章推荐
- 练习2-1 编写一个程序一确定分别由signed及unsigned限定的char,short,int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现。通过直接计算来确定浮点类型的取值范围是一项难度很大的任务。
- 带符号的char类型取值范围为什么是-128——127
- 关于char类型的取值范围
- 练习 2-1 编写一个程序以确定分别由 signed 及 unsigned 限定的 char、short、 int 与 long 类型变量的取值范围。
- 打印signed 及unsigned限定的char short int 及long类型变量的取值范围
- 关于char类型的取值范围
- 带符号的char类型取值范围为什么是-128——127
- 带符号的char类型取值范围为什么是-128——127
- 打印分别由signed和unsigned限定的char , short, int ,与long类型变量的取值范围。
- 关于char类型的取值范围
- 关于char类型的取值范围
- C、C++数据类型(int, long, short, char, long long) 的取值范围、最大最小值:climits 里的一些宏
- 程序猿之---C语言细节25(数据类型取值范围、char细节、浮点数细节)
- 编写一个程序,分别以signed和unsigned限定的char、short、int与long类型的变量取值范围
- 计算char,short,int,long类型变量的取值范围
- 编写一个程序以确定分别由signed及unsigned限定的char、short、int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现
- 计算char,short,int,long类型变量的取值范围
- 练习2-1 编写一个程序以确定分别由signed及unsigend限定的char short int 与long类型变量的取值范围
- C语言中基本类型char、short、int、long等类型的取值范围
- C语言中基本类型char、short、int、long等类型的取值范围