添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

有符号整数中用来表示符号的是最高位, 最高位为 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;