有符号整数中用来表示符号的是最高位,
最高位为
0
表示正数,最高位为
1
表示负数
。在内存中同样占
4
个字节,由于最高位为符号位,不能用于表示数值,因些有符号整数的取值范围要比无符号数取值范围少
1
位,
既
0x80000000~0x7FFFFFFF;
负数在内存中都是以补码的形式存放。
正数的补码是其本身
负数的补码:先求其相反数的补码,然后对该补码的二进制逐位求反,最后加 1。
-10
10二进制:1010
扩展为32位:1000,0000,0000,0000,000,0000,0000,1010 最高位为符号位
补码: 1111,1111,1111,1111,1111,1111,1111,0101 + 1
=1111,1111,1111,1111,1111,1111,1111,0110
=0xfffffff6
x + x(反码) + 1 = 0
补码 = 0 - x = x(反码) + 1
-69DA H
二进制: 1000,0000,0000,0000,0110,1001,1101,1010 B
按位求反:1111,1111,1111,1111,1001,0110,0010,0101 B
加一: 1111,1111,1111,1111,1001,0110,0010,0110 B
f f f f 9, 6, 2, 6 H
6 9 D A
+ ? ? ? ? (9625H)
--------------------
F F F F
在
C++
中,使用浮点方式存储实数,用两种数据类型来保存浮点数:
float(
单精度
)
、
double(
双精度
)
。
Float
在内存中占
4
个字节,
double
在内存中占
8
字节空间
。
浮点数的编码方式
浮点数编码转换采用的是
IEEE
规定的编码标准
,
float
和
double
这两类型数据的转换原理相同。
IEEE
规定的
浮点数编码会将一个浮点数转换为二进制数
。以科学记数法划法,将浮点数拆分为
3
部分:
符号、指数、尾数
。
float
类型的
IEEE
编码
float
类型在内存中占
4
个字节(
32
位),
最高位用于表示符号
;
在剩下的
31
位中,从右向左了
8
位用于表示指数
,
其余用于表示尾数
。如图:
正指数情况
例:将
float
类型
10.625
转换为
IEEE
编码,需要将
10.625
转换成对应的二进制数(10.625 * 2^3 = 85 (1010101)):
1010.101,
整数部分为
1010,
小数部分为
101;
然后对单精度数进行科学记数法转换:将
小数点向左移动
,每个移动
1
次指数加
1
,移动到除符号位的最高位为
1
处,停止移动,
这里移动
3
次(移动多少次指数部分就是多少)
。
对
10.625
进行科学记数法转换后二进制部分为
1.010101,
指数部分为
3
。在
IEEE
编码中,由于在二进制情况下最高位始终为
1
,为一个恒定值,故将其忽略不计。
这里是一个正数,所以符号位为
0
,指数部分:由于指数部分可能出现负数,十进制数
127
可表示为二进制数
01111111
。
IEEE
编码方式规定,当指数小于
01111111
时为一个负数,反之为一个正数。
10.625
经
IEEE
转换后各位的情况如下:
符号位:
0
指数位:
3+127
(十进制),转为二进制
10000010
尾数位:
01010100000000000000000
(当不足
23
位时,低位补
0
填充)
10.625
转换后的
IEEE
编码按二进制拼接为:
01000001001010100000000000000000
转换成十六进制数为:
0x412A0000
,由于内存以小尾方式进行排列,故为
:00 00 2a 41
-0.8125
经
IEEE
转换后各位的情况如下:
-0.8125
的二进制为
-0.1101
符号位:
1
指数位:
-1+127
(十进制),转为二进制
01111110(
如果不足
8
位,高位补
0)
尾数位:
10100000000000000000000
(当不足
23
位时,低位补
0
填充)
-0.8125
转换后的
IEEE
编码按二进制拼接为:
10111111010100000000000000000000
转换成十六进制数为:
0xBF500000
,由于内存以小尾方式进行排列,故为
:00 00 50 BF
如果小数部分转换为二进制时得到一个无穷值,则根据尾数长度舍弃多余部分。
Double
类型的
IEEE
编码
Double
类型的和
float
类型大同小异,只是
double
类型表示的范围更大,占用的空间更多,是
float
类型所占空间的两倍。
double
类型:指数用
11
位正数表示,加上
1023
用于指数符号判断。
在
C++
中,字符的编码格式分两种:
ASCII
和
Unicode.
ASCII
编码在内存中占一个字节大小,只能表示
26
个字母和常用符号。
Unicode
编码在内存中占两个字节大小,表示的范围是
0~65535.
在
Microsoft Visual C++ 6.0
中,使用
char
定义
ASCII
编码格式的字符,使用
wchar_t
定义
Unicode
编码格式字符。
#include <iostream>
void fun(bool flag)
if (flag) {
printf("hello world\n");
else {
printf("sorry.\n");
//int a = 0, b = 4;
//int c = b / a;
int main()
bool m = false;
unsigned int a = 10;
int b = -10;
float c = 10.625;
fun(m);
const char *p = "Hello World!\n";
const wchar_t* w = L"hello Unicode";
system("pause");
return 0;