二进制、八进制、十六进制转换

二进制、八进制、十六进制转换
二进制、八进制、十六进制转换

第五章变量和常量

5.1 从类型到变量

5.1.1 公孙龙的“白马非马”

5.1.2 定义变量

5.1.3 如何为变量命名

5.1.4 如何初始化变量

5.1.4.1 什么时候需要给变量初始化?

5.1.4.2 初始化变量的两个时机

5.1.4.3 通过计算得到初始值

5.1.4.4 变量的取值范围

5.2 变量与内存地址

5.3 常量

5.3.1 几种数据类型常数的表达方法

5.3.1.1 整型常数的表达

5.3.1.2 实型常数的表达

5.3.1.3 字符常量的表达

5.3.1.4 字符串常量

5.3.2 用宏表示常数

5.3.3 常量定义

5.3.4 枚举常量

5.3.4.1 为什么需要枚举类型

5.3.4.2 定义枚举类型的基本语法

5.3.4.3 关于枚举常量的输出效果5.1 从类型到变量

5.1.1 公孙龙的“白马非马”

(该版课程的内容更新及订正均已停止)

旧版课程打包下载

----------------------------------

[想看涵盖“面向对象”、“图形编程”、“泛型编程”……

的“最新2008年版白话C++”课程,请点击!] (另有: 博客版)

故事是春秋时的公孙龙先生说的。

城门上告示:“马匹不得入城”。公孙龙同志骑白马而来,遭拒入。公孙龙一脸正色:“告示上写的是‘马’,而我骑的是‘白马’,难道‘马’等于‘白马’吗?”

守门士兵觉得白马还真不是马,于是放行。

依公孙龙先生的理论认为:如果白马是马,黑马也是马,那么岂不白马等于黑马,所以,不能说白马是马。“白马非马”是中国哲学史上的一桩公案。不过,若是我们从程序的角度上说,可以认为:马在这里表示一种类型,而白马,黑马它们的类型都是马。

白马,黑马具有相同的“数据类型”,但它们都相对独立的个体。从这点说,别说有白黑之分,就算同样是白马,这一匹和哪一匹白马,也是相对独立的个体。

在程序中,“类型”和“变量”的关系正是“马”和“白马”的关系。

如果C或C++有这种数据类型: Horse,那么,定义一匹“白马”的变量应该这样:

Horse AWhiteHorse;

以后我们说不定真的有机会自已定义Horse,不过现在,我们在上一章的学的数据类型是:

char,int,bool 等等。

假设我们需发使用一个有关年龄的变量,在C或C++中是这样定义的:

int age;

现在让我们来事先建立一个空的工程,随着本章课程的进展,我们需要不断地在工程中加入零星的代码,及时实践。

仍然是一个空的控件台程序。方法是……以前我们讲过,忘了就看前面章节吧。

代码文件Unit1.cpp中,手工加入以下的黑体部分:

//---------------------------------------------------------------------------

#include

#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused

int main(int argc, char* argv[])]

{

getchar();

return 0;

}

//---------------------------------------------------------------------------

5.1.2 定义变量

语法:

数据类型变量名;

“张三”既可以指张三这个人,也可以是张三的名字。同样,上面的“变量名”,其实也就是变量本身。

举上一节的例子:

int age;

其中,int 是数据类型(整型),而 age 是变量名,更多的时候,我们就说是变量 age。最后是一人分号。它表示定义一变量在C或C++里一句完整的语句。因为C++的语言总是以分号结束。

如果要声明一个字符类型变量:

char letter;

声明一个bool类型的变量:

bool do_u_love_me;

其它类型,除了void不能直接定义一个变量以外,格式都是一样的。

void avoid; //错!void 类型无法直接定义一个变量。

有时同一时候同一数据类型需要多个变量,此时可以分别定义,也可以一起定义:

int a;

int b;

int c;

下面采用一起定义,会更省事:

int a,b,c;

一起定义多个同类型变量的方法是:在不同变量之间以逗号(,)分隔,最后仍以分号(;)结束。

让我们来试试变量定义,另外,我们还要趁此机会,看看一个变量在仅仅进行定义之后,它的值会是什么。继续上一小节的代码。仍然是加入黑体部分,当然 // 及其后面的内容是注释,你可以不输入。......

int main(int argc, char* argv[])]

{

/////////////////定义变量//////////////////////////////////////////////////

//以下定义三个变量:a,b,c

int a;

double b,c;

//a,b,c仅仅被定义,它的值会是什么?我们用 cout 输出三个变量:

cout << "a = " << a << " b = " << b << " c = " << c << endl;

getchar();

return 0;

}

最好先保存代码文件和工程文件。然后按F9运行。以下是笔者机器得到结果。

a 是1,b和c都像天文数字?嗯,从这里我们学到一个C,C++编程极其重要知识:未初始化的变量,它的值将是未确定的。所谓“未初始化”,就是指这个变量只有定义代码,而没有赋值。

(立即重复执行这段代码,得到结果可能都一样,但这并不说明这些值就是可以确定不变。)

5.1.3 如何为变量命名

C/C++的变量的名字中只能有以下字符:大小写字母、阿拉伯数字(但不能做为开头)、下划线 _。

汉字不能成为变量名。

不过,就算允许,又有谁会这么累呢,用汉字作变量名?

不能或不要

不能取名为C、C++的保留字。

如:

int char; //不行

这是不被允许的。char 是一个保留字。我们不能再拿来做变量。

不能超过250个字符。

这在BCB里有规定。是一个可以调整的值。

不能以数字开头

int 100; //不行

int 100ren; //不行

不能夹有空格

bool do you love me; //不行

你可以用下划线代替空格:

bool do_you_love_me; //OK

不能在同一作用范围内有同名变量(仅C++)

比如:

int abc;

int abcd;

int abc; //不行

在C里,上面重复定义变量 abc是被允许的。

关于作用范围,我们以后会讲到。

不要和C、C++中已有的全局变量,函数,类型名取相同的名字。

double sin;

这不合适。因为C库为我们提供了计算正弦值的函数,名字就叫 sin;

不要太长。

是的,250个字符其实太长了。如果有个变量名长达30个字母,我看不仅你自已写得累,别人看着也会觉得是在读外国小说,主人公的名字太长,烦人。

不要太短

这个我们放到后面说。

以上几点中,凡标为“不能”,意味如果你违反了,你的程序便会在编译时出错。而“不要”则仅属建议内容。真要这么做,程序也没错。

另外,我们还建议要为每个变量取一个有意义的名字。比如 NumberOfStudents,这个变量一看就明白是为“学生的人数”定义的。而如果定义为 aaa,cc,之类,就容易混淆。当然,有一些约定成俗的用法,如字母i,j,等常用来作循环流程中的计数变量。再者,有意义的名字并不是指一定要把变量所要代表的意思用英文句子写出,一般可以用简写,如 NumOfStudent,它同样意义明了,但更简短。而且,如果我们英文一般,那么有时也可以使用拼音。这里就不举例了,因为笔者连拼音都很次。

前面说到取名不要太短,说的就是避免像 aaa,cc之类的图输入方便,但毫无意义,不可读的变量命名习惯。

(你很快就会在教程中发现,笔者似乎自已违反了这个规定,用一些a,b,c作为变量名。这不能说是笔者的错。因为会有些时候变量的意义并不重要)

最后,C,C++是区要大小写的语言,所以变量 Num 和变量 num 完全是两个变量。大家在定义,使用变量要注意到这一点。

关于变量的命名,我们不做实践。下面附加说说编程中命名的一些风格。

附:关于命名变量的几种风格。

较早以前,现在仍流行于UNIX、Linux编程界,程序员喜欢用全部小写的单词来命名变量,如果两个单词,比如my car,常用的命名方法有两种:my_car或myCar。my_car自然看起清楚,不过输入频繁地下划线是件累事(根据指法,下划线必须使用小指头按)。后一种方法被称为“驼峰表示法”,原因是大写字母看起来想凸起的驼峰。

之所以不使用MyCar,原因是C/C++允许程序自定义数据类型,所以有必要从一个名字上很快地区分它是变量或是数据类型。方法是让自定义的数据类型都用大写开头。比如前面的说的“马”是程序员自定的数据类型,那么如果采用这里的命名规则,则应取名为:Horse,而“一匹白马”是变量,所以取名为:aWhiteHorse。

Horse aWhiteHorse;

在C++ Builder里,并没有限制大家如何为变量取名。所以为了仍可以很明显的做到上述的区分,CB的方法是对用户

自定义的数据类型在前头加一个字母T(Type的首字母)。仍如 Horse,则改名为:THorse。前面我们写Windows版的hello world时,使用了一个Label控件,其实,检查代码你会发现,它的类名就叫:TLabel。

最后还有一种方法是匈牙利标记法(Hungarian notation)。该法要求在每人变量的前面加上若干个用于表示该变量的数据类型的小写字母。如iMyCar表示这个变量是整型(i表示int);而倘若是cMyCar,则表示这个变量是char类型。该法经过一段时间的训练熟悉以后,会带来一些好处。问题是如果对自定义的数据类型也按这种方法进行,就不是经过训练就能熟悉了。比如hoWhite,这个名字中的ho表示“马”,真有点强人所难。举上实际存在的例子,在Windows API中,如果你看到:

LPCITEMIDLIST pidlRoot;

想要一眼看明白 pidRoot,必须的要求是你很明白 ITEMIDLIST 是什么玩意儿了。

是的,Windows的API使用的是最后一种方法。在大多数情况下,它的变量的名字都看上去怪怪的。

在本部教程中,我们在正式程序中,最常使用的方法是简单的“驼峰”法。

5.1.4 如何初始化变量

5.1.4.1 什么时候需要给变量初始化?

int a;

声明了一个整型变量a。但这变量的值是多少?a等于0吗?还是等于100?我们都不知道。“不知道”的意思是:a 有值,但这个值的大小是随机的,所以我们无法确定。

无法确定一个变量值是常有的事,比如我们要求用户输入他的年龄。我们需要声明一个整型变量来存储用户年龄,但在用户输入之前,我们是无法确认它的值。

但有些时候,我们可以事先给一个变量初始时的值。同样是年龄的问题,虽然我们不知道用户到底几岁,但我们知道他不可能是 0 ,所以我们把年龄一开始设为0。为什么要这样?用户有时不小心忘了输入年龄(就像我们在网上填表一样),我们就可以检查年龄是否为0来发现了。另外一种相反的用法是,我们发现大都数用户是8岁(比如一个小学生入学登记表),这时我们初始化年龄变量为8,目的是为了方便用户了。

那么,如果为一个变量赋值呢?

答案就像我们初中的代数:设 x = 10, y = 100。用等号。请记住:现实生活中,等号(=)有两个意义,但在C/C++里,=只用来给一个变量赋值。

5.1.4.2 初始化变量的两个时机

1.在定义时初始化变量

int a = 0;

通过一个等号,我们让a的值等于0;

同时定义多个变量时也一样:

int a = 0, b= 1;

当然也可以根据需要,只给部分变量初始化。

int a = 0, b;

或:

int a,b = 1;

2.在定义以后赋值

int a;

a = 100;

5.1.4.3 通过计算得到初始值

给变量赋值,除了给一个直接的值以外,还可以通过计算获得。如:int a = -3 + 200 - 5;

或者如:

int a = 9;

int b = 3;

int c = a / b;

(/ 表示除号)

现在来试试给变量赋值的几种方法。

......

int main(int argc, char* argv[])]

{

/////////////////定义变量////////////////////////////////////////////////// //以下定义三个变量:a,b,c

int a;

double b,c;

//用 cout 输出三个变量:

cout << "a = " << a << " b = " << b << " c = " << c << endl;

/////////////////初始化变量//////////////////////////////////////////////// int d = 0;

float e = 1.234, f;

f = 567.8 + 0.2;

cout << "d = " << d << " e = " << e << " f = " << f << endl;

getchar();

return 0;

}

5.1.4.4 变量的取值范围

1). 变量允许取值范围=变量数据类型的范围

关于赋值的最后一个需要注意的是:变量的取值范围。

变量的取值范围?变量是有类型的,变量的允许的取值范围等同于其数据类型的范围。比如一个整型数,那么它的取值范围就是:-2147483648 ~ 2147483647。而如果是一个字符类型,它的取值就不能是 -129。

以下是示例:

int a = 3000000000; //错误!

char b = -129; //错误!

我们来写代码实践一下。由于char类型计算机在输出将直接输出字符,我们不好观察结果,所以我们选择了int类型。

......

int main(int argc, char* argv[])]

{

/////////////////定义变量//////////////////////////////////////////////////

//以下定义三个变量:a,b,c

int a;

double b,c;

//用 cout 输出三个变量:

cout << "a = " << a << " b = " << b << " c = " << c << endl;

/////////////////初始化变量////////////////////////////////////////////////

int d = 0;

float e = 1.234, f;

f = 567.8+ 0.2;

cout << "d = " << d << " e = " << e << " f = " << f << endl;

/////////////////变量值越界//////////////////////////////////////////////////

int g = 3000000000; //给g赋值超过int允许的范围,所以g的值不可能如愿等于3000000000

cout << "g = " << g <

getchar();

return 0;

}

g 的值已经溢出,它的值究竟是多少?自已按F9运行,看结果吧。

2). bool 类型的特殊

至于 bool 类型,事实上它的内存空间范围和char一样是一字节的(因为计算机能直接处理的最小内存单位是字节),所以按说它也能存256个不同的值,但作为C++的一个规定,强制给它两个值: false,true。那么 false 是什么呢?其实它是0。而 true则是非0的数。也就是说,值0对应为false,而所有非0的数对应成true。

所以,你这样给bool类型的变量赋值自然没错:

bool do_u_love_me = false; //噢,你不爱我。

bool do_u_love_me = true;

但你也可以这样给来:

bool do_u_love_me = 0;

bool do_u_love_me = 1;

当然,我们建议使用第一种方法,那是“正规”的方法。

在C里,并没有bool这个数据类型,所以C程序员采用的方法是自定义:

typedef char BOOL;

如果你在某些书上碰到BOOL,你就可以明白它就是我们学的 bool.

false和true到底是什么?“假”或“真”,很简单啊。噢,我不是问二者的意思,C++之所以要加入bool类型,目的也是为了让程序员在处理那些只用于表示“真或假”、“是或否”等数据时,可以用直观的false和true来表示。而在计

算机内部,二者仍然是数。让我们写几行代码,揭开bool类型的“假面”。

......

int main(int argc, char* argv[])]

{

/////////////////定义变量//////////////////////////////////////////////////

//以下定义三个变量:a,b,c

int a;

double b,c;

//用 cout 输出三个变量:

cout << "a = " << a << " b = " << b << " c = " << c << endl;

/////////////////初始化变量////////////////////////////////////////////////

int d = 0;

float e = 1.234, f;

f = 567.8 + 0.2;

cout << "d = " << d << " e = " << e << " f = " << f << endl;

/////////////////变量值越界//////////////////////////////////////////////////

int g = 3000000000; //给g赋值超过int允许的范围,所以g的值不可能如愿等于3000000000 cout << "g = " << g <

/////////////////bool类型的"真面目"//////////////////////////////////////////

bool h = false ,i = true;

cout << "h = " << h << " i = " << i << endl;

getchar();

return 0;

}

运行后……原来,false是0,true是1。

3). char 类型的特殊

char 的范围是 -128 ~ 127

unsigned char 的范围是 0 ~ 255

那么按照前面的说法,我们可以为这样为一个字符类型的变量赋值:

char c = 120;

unsigned char uc = 250;

这样看来,所谓的“字符”类型,似乎除了取值范围小一点以外,和整型也没有什么区别。这句话的确没错。对于C、C++来说,字符类型完全可以当成一个整数来对待。

事实上,所有信息在计算机里,都是使用数字来表达。英文字母 'A' 在计算机里表示为 65; 字母 'B' 表示为66。所有你在键盘可以看到的字符,如大小写英文字母,阿拉伯数字符号,标点符号都可以有一个相应的数值表示。

但要让我们记住65就是'A',而33就 '!'等255个对应关系,显然很折磨人,所以,计算机高级语言允许我们直接为字符类型变量这样赋值:

char c = 'A';

char d = '!'; //英文感叹号

char e = '.'; //英文句号

char f = ' '; //空格

即:将所要得到的字符用单引号括住。(引号''是英文状态下的,千万不要使用中文符号)

另外,对于一个数值类型,如果它等于120,那么输出时显示的120,如果是一个字符类型,输出却是120对应的字符。也就是说:

int k = 120;

char j = 120;

二者虽然值都为120,但输出j时,计算机并不显示120这个值,而是120对应的字符。试试看!

为了不让教程中的代码重复占用版面,省略号省略掉的代码要多点了……

......

/////////////////char 类型///////////////////////////////////////////////////

int k = 120;

char j = 120;

cout << "k(int) = " << k << " j(char) = " << j << endl;

getchar();

......

输出结果,k当然是120,但j,原来120对应的字母是 'x'。写的是120,输出的却是x,很不直观对不?所以,除非我们故意要和自已或者其他看代码的人玩“密码”,否则,还是直接想要什么字符,就写哪个字符吧。

/////////////////char 类型///////////////////////////////////////////////////

int k = 120;

char j = 120;

cout << "k(int) = " << k << " j(char) = " << j << endl;

char l = 'A';

char m = l + 1;

cout << "l = " << l << " m = " << m << endl;

getchar();

......

输出结果,l为 'A',而 m 为 'B',想一想,为什么?学完后面内容就有答案。

单引号本身也是一个字符,如何表示单引号呢?是否用 ''' 来表示?看明白下面的常用字符ASCII码表以后再说。

(ASCII是指:American Standard Code for Information Interchange,美国信息交换标准码。)

(其中,0~31都是一些不可见的字符,所以这里只列出值为0的字符,值为0的字符称为空字符,输出该字符时,计算机不会有任何反应。我们以后会学习0字符的特殊作用。)

4). 转义符的使用

根据前面的说法,单引号应该表达为:

char c = ''';

但这是错误的。C、C++不认识 ''',因为它容易引起歧义。

另外,有一些字符属于不可见的字符,无法直接写出,比如键盘上大大的回车键,在输入文档时,用它可以输入一个回车换行,显然我们不能这样在C/C++里表示一个回车换行:

char c = '

'

在第一个'和第二个'之间夹了一个换行,这样的表示方法不仅不方便,C和C++也不认。

类似这样的问题还有制表符(键盘上的Tab键)等等。

解决的方法是使用转义符.C/C++使用反斜杠'\'作为转义符。如:

'\'' : 表示单引号;

'\"' : 表示双引号;

'\n' : 表示换行(n : line);

下面列出常用的C、C++特殊字符:

这里顺便解释一下“回车换行”是什么,尽管我们对这个词耳熟得很。

“回车换行”是“回车”加“换行”。

换行好理解,但什么叫“回车”呢?它和“换行”又有什么关系?

原来,“回车换行”的概念源于早先的打字机。类似于现在打印机中有一个打印头,这个打印头平常停在打印机内的某一端。在打印一行时,则需要向外移动,打印一行结束后,打印头需要回到原来位置。由于打印头在英文中用“车”来表示,所以这个动作就称为“回车”,用金山词霸的中的解释就是:“将打印或显示位置移到同行起始位置的运动。”

所以对于打印机,假设有两行字,两行之间若光有“回车”,那么这两行字将重叠在一起(对于控制台程序的屏幕,则将回到行首)。如果光有“换行”,则第二行将不从起始位置打起,样子如下:

这是第一行

这是第二行。

只有既输出“回车”又输出“换行”,才是我们常见的换行结果。当然,对于当今的大都软件,往往都把单独的回车或换行直接解释于二者的结合。

转义符的另外一种用法是直接接数值。但必须采用8进制或16进制。这里暂不讲解。

如果需要使用数值表示,最直接的还是使用类似: c = 120; 的方法。比如要让变量c的值为单引号,我们至少可以有以下2种方法:

char c = '\''; //使用转义符

char c = 39; //直接赋给字符的ASCII的值。

转义符的内容,看上去怪怪的?不过,多用几次我们就会明白。

/////////////////char 类型///////////////////////////////////////////////////

int k = 120;

char j = 120;

cout << "k(int) = " << k << " j(char) = " << j << endl;

char l = 'A';

char m = l + 1;

cout << "l = " << l << " m = " << m << endl;

/////////////////转义符//////////////////////////////////////////////////////

cout << "TAB:" << '\t' << "AA" << endl;

cout << "换行:" << '\n' << "AA" << endl;

cout << "回车:" << '\r' << "AA" << endl;

cout << "听到BEEP声了吗?" << '\a' << endl;

cout << '\'' << endl;

cout << '\"' << endl;

cout << '\\' << endl;

getchar();

......

在执行之前,有必要稍作解释。

首先那是“AA"做什么用。因为制表符、回车、换行等特殊字符,其输出效果是改变光标位置,所以我们需要一些上下文来显示出光标位置改变效果,这里就随便写个“AA”了事。

然后是在cout语句中,平常我们叫是使用双引号输出一行话,但如果当前要输出只是一个字符,我们也可以使用单引号。

至于所谓“BEEP”声,你可别抱太多期望,它只是计算机内置的小喇叭短促一个声音,听起来并不美妙。

现在来看结果(请只关心转义符部分):

关于输出结果的几点说明:

1、需要注意的是 '\t' 在控制台窗口的输出效果,如果前面的字符长度已超过一个制表位,那么后面的第一个'\t'将是没有效用的。(要理解这一点,你可以将代码中“TAB”加长一点,如"TABTAB")。

2、“AA车”的输出结果是怎么来的呢?请大家考虑考虑。

试验程序在这里结束。

5.2 变量与内存地址

前面讲到“白马、黑马”时,我们说一匹白马和一匹黑马具有共同的数据类型

“马”,但二者是相对独立的个体。现在我们以共熟悉的“人”来继续这个话题,

最终引出变量与内存地址的关系。

张三和李四的数据类型都是“人类”。但张三和李四显然是独立的量:张三吃

了两块蛋糕,李四不可能因此就觉和肚子饱了;而李四在下班的路上捡到一个钱

包,虽然正好是张三的,两人似乎通过钱包有了点关系,但谁得谁失仍然不容混淆。

这一切都很好理解。张三和李四之所以是不同的个体,根本原因在于两人有着不同的肉身。如果是一对连体婴儿,虽然也是两个人,但当左边的婴儿被蚊子咬一口时,右边婴儿是否也会觉得痒,就不好说了。

现在我们困难的是,如何理解两个不同的变量,也是互相独立的呢?

答案就在“内存地址”,“内存地址”就是变量的肉身。不同的变量,拥有不同的内存地址。譬如:

char a;

char b;

上面有两个字符类型的变量a和b,a拥有自已的内存地址,b也拥有自已的内存地址,二者绝不相同。而a、b只不过分别是那两个内存地址的“名字”,恰如“张三、李四”。

让我们看图解:

看,内存就像是开宾馆的。不过这有宾馆有点怪。首先它每一个“房间”的大小都是一个字节(因此,计算机能单独处理的最小内存单位为字节)。它的门牌号也不叫房号,而是叫内存地址。

在左图中,“房客”,变量a住在内存地址为1000002的内存中,而变量b则住在它的隔壁,地址为100003的内存中。另外,如果你足够细心,你还会发现:内存地址由下往上,从小到大排列。

二进制十进制八进制十六进制转换练习题

数制及相互转换 一、单选题 1、下列数据中数值最小的是 A、01110000B B、249D C、125Q D、AAH 2、下列数据中数值最大的是 A、3FH B、64D C、77Q D、111110B 3、下列数据中数值最大的是 A、100H B、100D C、100Q D、100B 4、十进制数24转换成二进制数是 A、11100 B、11010 C、11000 D、10100 5、下列数据中数值最小的是 A、11110000(二进制) B、249(十进制) C、274(八进制) D、FA(十六进制) 6、下列数据中数值最大的是 A、11101101(二进制) B、235(十进制) C、351(八进制) D、EE(十六进制) 7、下列各数中最大的是 A、11010110B B、D7 H C、214D D、325Q 8、与二进制数100101等值的十进制数是 A、34 B、35 C、36 D、37 9、与十进制数256等值的二进制数是 A、1000000 B、10000000 C、100000000 D、1000000000 10、与十六进制数ACE等值的十进制数是 A、2766 B、2765 C、2764 D、2763 11、十六进制数111与八进制数111之和,用八进制数表示为 A、310 B、1222 C、1000 D、532 12、按某种进制运算2 × 4=12,那么4 × 5为 A、20 B、32 C、24 D、12 13、若216是某种数制的一个数,它的值与十六进制数8E相等,则该数是()进制数。 A、六 B、八 C、九 D、十 14、下列各数中,属于合法的五进制数的是 A、216 B、123 C、354 D、189 15、下列无符号十进制中,能用8位二进制表示的是 A、257 B、288 C、256 D、255 16、无符号二进制数后加上一个0,形成的数是原来的几倍? A、1 B、2 C、1/2 D、4 17、下列数据中数值最大的是 A、(10000)2 B、(17)8 C、(17)10 D、(10)16 18、某学校有1500名学生,若用二进制来编学号,需要多少位来表示。 A、10 B、11 C、12 D、13

二进制、十进制和十六进制及其相互转换的公式

计算机内部是以二进制形式表示数据和进行运算的;计算机内的地址等信号常用十六进制来表示,而人们日常又习惯用十进制来表示数据。这样要表示一个数据就要选择一个适当的数字符号来规定其组合规律,也就是要确定所选用的进位计数制。各种进位制都有一个基本特征数,称为进位制的“基数”。基数表示了进位制所具有的数字符号的个数及进位的规律。下面就以常用的十进制、二进制、八进制和十六进制为例,分别进行叙述。 一.常用的三种计数制 1.十进制(Decimal) 十进制的基数是10,它有10个不同的数字符号,即0、1、2、3、…、9。它的计数规律是“逢十进一”或“借一当十”。处在不同位置的数字符号具有不同的意义,或者说有着不同的“权”。所谓的“权”就是每一位对其基数具有不同的倍数。例如,一个十进制数为 123.45=1×102十2×101十3×100十4×10-1十5×10-2 等号左边为并列表示法.等号右边为多项式表示法,显然这两种表示法表示的数是等价的。 在右边多项式表示法中,1、2、3、4、5被称为系数项,而102、101、100、10-1、10-2等被称为该位的“权”。 一般来说,任何一个十进制数”都可以采用并列表不法表不如下: N10=dn-1d n-2…d1d 0. d-1d-2…d-m 其中,下标n表示整数部分的位数,下标m表示小数部分的位数,d是0~9中的某一个数,即di∈(0,1,…,9)。同样,任意一个十进制数N都可以用多项式表示法表示如下: N10=dn-1×10n-1十…十d1×101十d 0×100十d-1×10-1十…十 d-m×10-m 其中,m、n为正整数,di表示第i位的系数,10i称为该位的权。所以某一位数的大小是由各系数项和其权值的乘积所决定的。 2.二进制(Binary) 二进制的基数是2,它只有两个数字符号,即0和1。计算规律是“逢二进一”或“借一当二”。例如:(101.01)2=1×23十1×22十0×21十1×20十0×2-1十1×2-2 任何一个二进制数N都可以用其多项式来表示: N2=dn-1×2n-1十dn-2×2n-2十…十d1×21十d 0×20十d-1×2-1十d-2×2-2十…十d-m×2-m 式中任何一位数值的大小都可以用该位的系数项di和权值2i的积来确定。 3.十六进制(Hexadecimal) 十六进制的基数为16,它有16个数字符号、即0~9、A~F。其中A、B、C、D、E、F分别代表十进制数的10、11、12、13、14、15。各位之间“逢十六进一”或者“借一当十六”。各位的权值为16i。例如:(2C7.1F)16=2×162十12×161十7×160十1×16-1十15×16-2 二.3种计数制之间的相互转换 对于同一个数,可以采用不同的计数制来表示,其形式也不同。如: (11)10=(1011)2=(B)16 1.R进制转换成十进制的方法 具体的方法是先将其并列形式的数写成其多项式表示形式,然后,经计算后就可得到其十进制的结果。这种方法披称为按权展开法。对于一个任意的R进制数N都可以写成如下形式: N=dn-1 dn-2…d1 d0d -1d-2…d-m =dn-1×Rn-1十…十d1×R1十d 0×R0十d-1×R-1十…十d-m×R-m 其中,R为进位基数,Ri是对应位的权值,di为系数项,特此式求和计算之后,即可以完成R进制数对十进制数的转换。 例如,写出(1101.01)2、(10D)16的十进制数。 (1101.01)2=1×23十1×22十0×21十1×20十0×2-1十0×2-2,

高中信息技术基础进制转换二进制十进制十六进制转换转化

2进制数转换为10进制 (110)2转化为十进制 10进制整理转换成2进制 于是,结果是余数的倒排列,即为: (37)10=(a5a4a3a2a1a0)2=(100101)2 16进制转化成2进制、2进制转化成16进制 (二进制和十六进制的互相转换比较重要。不过这二者的转换却不用计算,每个C,C++程序员都能做到看见二进制数,直接就能转换为十六进制数,反之亦然。) 16进制转化成2进制:每一位十六进制数对应二进制的四位,逐位展开。 二进制数转为十六进制:将二进制数转换成十六进制数是将二进数的整数部分从右向左每四位一组,每一组为一位十六进制整数,不足四位时,在前面补0 (FB)16=(1111 ,1011)2 互转

2进制与16进制的关系: 2进制0000 0001 0010 0011 0100 0101 0110 0111 16进制0 1 2 3 4 5 6 7 2进制1000 1001 1010 1011 1100 1101 1110 1111 16进制8 9 A B C D E F 可以用四位数的二进制数来代表一个16进制,如3A16 转为二进制为: 3为0011,A 为1010,合并起来为00111010。可以将最左边的0去掉得1110102 右要将二进制转为16进制,只需将二进制的位数由右向左每四位一个单位分隔,将各单位对照出16进制的值即可。 16进制数转换为10进制数 假设有一个十六进数 2AF5, 那么如何换算成10进制呢? 用竖式计算: 2AF5换算成10进制: 直接计算就是: 5 * 16^0 + F * 16^1 + A * 16^2 + 2 * 16^3 = 10997 (别忘了,在上面的计算中,A表示10,而F表示15) 假设有人问你,十进数 1234 为什么是一千二百三十四? 你尽可以给他这么一个算式: 1234 = 1 * 10^3 + 2 * 10^2 + 3 * 10^1 + 4 * 10^0 如十进制数2039 它可以表示为:2*10^3+0*10^2+3*10^1+9*10^0

二进制转换十六进制

二进制转换十六进制 在Java中字节与十六进制的相互转换主要思想有两点: 1、二进制字节转十六进制时,将字节高位与0xF0做"&"操作,然后再左移4位,得到字节高位的十六进制A;将字节低位与0x0F做"&"操作,得到低位的十六进制B,将两个十六进制数拼装到一块AB就是该字节的十六进制表示。 2、十六进制转二进制字节时,将十六进制字符对应的十进制数字右移动4为,得到字节高位A;将字节低位的十六进制字符对应的十进制数字B与A做"|"运算,即可得到十六进制的二进制字节表示 我测试的Java代码如下: Java代码 public class Test01 { private static String hexStr = "0123456789ABCDEF"; private static String[] binaryArray = {"0000","0001","0010","0011", "0100","0101","0110","0111", "1000","1001","1010","1011", "1100","1101","1110","1111"}; public static void main(String[] args) { String str = "二进制与十六进制互转测试"; System.out.println("源字符串:\n"+str); String hexString = BinaryToHexString(str.getBytes()); System.out.println("转换为十六进制:\n"+hexString); System.out.println("转换为二进制:\n"+bytes2BinaryStr(str.getBytes())); byte [] bArray = HexStringToBinary(hexString); System.out.println("将str的十六进制文件转换为二进制再转为String:\n"+new String(bArray)); } /** * * @paramstr * @return 转换为二进制字符串 */ public static String bytes2BinaryStr(byte[] bArray){ String outStr = ""; intpos = 0;

二进制,八进制,十进制,十六进制之间的转换

二进制,八进制,十进制,十六进制之间的转换 1.什么是二进制 二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。计算机中的二进制则是一个非常微小的开关,用“开”来表示1,“关”来表示0。 信息的存储单位 位(Bit) :度量数据的最小单位 字节(Byte):最常用的基本单位,一个字节有8位 b7 b6 b5 b4 b3 b2 b1 b0 1 0 0 1 0 1 0 1 =27+24+22+20=149 K字节1k=1024 byte M(兆)字节 1M=1024K G(吉)字节 1G=1024M T(太)字节 1T=1024G 曾经听人说,一个c,c++大神,就靠输入,0和1就可以装好操作系统,不知道是不是真的,嘿嘿 2.十进制转换

1234[10进制] 0 1 2 3 4 5 6 7 8 9 0 当数位上的值超过9就要进1 1000+200+30+4=1*103+2*102+3*101+4*100=1234 1011[2进制] 0 1 当数位上的值超过1就要进1 1*23+0*22+1*21+1*20=8+0+2+1=11 1011[8进制]0 1 2 3 4 5 6 7 当数位上的值超过7就要进1 1*83+1*81+1*80=512+8+1=521 1011[16进制]0 1 2 3 4 5 6 7 8 9 A B C D E F 当数位上的值超过15就要进1 1*163+1*161+1*160=4096+16+1=4113 当然其他进制转换成10进制是最简单的了,我想聪明的你肯定会了。

进制转换计算

二进制、八进制、十进制与十六进制 一、进制的概念 在计算机语言中常用的进制有二进制、八进制、十进制和十六进制,十进制是最主要的表达形式。 基数:基数是指一种进制中组成的基本数字,也就是不能再进行拆分的数字。二进制是0和1;八进制是0-7;十进制是0-9;十六进制是0-9+A-F(大小写均可)。也可以这样简单记忆,假设是n进制的话,基数就是【0,n-1】的数字,基数的个数和进制值相同,二进制有两个基数,十进制有十个基数,依次类推。 运算规则:运算规则就是进位或错位规则。例如对于二进制来说,该规则是“满二进一,借一当二”;对于十进制来说,该规则是“满十进一,借一当十”。其他进制也是这样。 三、二进制转化成其他进制 1. 二进制(Binary)——>八进制(Octal) 例子:将二进制数(10010)2转化成八进制数。(10010)2=(010 010)2=(2 2)8=(22)8 将二进制数(0.1010)2转化为八进制数。(0.10101)2=(0. 101 010)2=(0. 5 2)8=(0.52)8 诀窍:因为每三位二进制数对应一位八进制数,所以,以小数点为界,整数位则将二进制数从右向左每3位一隔开,不足3位的在左边用0填补即可;小数位则将二进制数从左向右每3位一隔开,不足3位的在右边用0填补即可。 2. 二进制(Binary)——>十进制(Decimal) 例子:将二进制数(10010)2转化成十进制数。 (10010)2=(1x24+0x23+0x22+1x21+0x20)10=(16+0+0+2+0)10=(18) 10将二进制数(0.10101)2转化为十进制数。 (0.10101)2=(0+1x2-1+0x2-2+1x2-3+0x2-4+1x2-5)10=(0+0.5+0.25+0.125+0.0625+0.03125)10=(0.96875)10 诀窍:以小数点为界,整数位从最后一位(从右向左)开始算,依次列为第0、1、2、3………n,然后将第n位的数(0或1)乘以2的n-1次方,然后相加即可得到整数位的十进制数;小数位则从左向右开始算,依次列为第1、2、3……..n,然后将第n位的数(0或1)乘以2的-n次方,然后相加即可得到小数位的十进制数(按权相加法)。 3. 二进制(Binary)——>十六进制(Hex) 例子:将二进制数(10010)2转化成十六进制数。(10010)2=(0001 0010)2=(1 2)16=(12) 16将二进制数(0.1010)2转化为十六进制数。 (0.10101)2=(0. 1010 1000)2=(0. A 8)16=(0.A8)16 诀窍:因为每四位二进制数对应一位十六进制数,所以,以小数点为界,整数位则将二进制数从右向左每4位一隔开,不足4位的在左边用0填补即可;小数位则将二进制数从左向右每4位一隔开,不足4位的在右边用0填补即可。 四、八进制转化成其他进制 1. 八进制(Octal)——>二进制(Binary) 例子1:将八进制数(751)8转换成二进制数。 (751)8=(7 5 1)8=(111 101 001)2=(111101001)2 例子2:将八进制数(0.16)8转换成二进制数。 (0.16)8=(0. 1 6)8=(0. 001 110)2=(0.00111)2 诀窍:八进制转换成二进制与二进制转换成八进制相反。 2. 八进制(Octal)——>十进制(Decimal) 例子1:将八进制数(751)8转换成十进制数。 (751)8=(7x82+5x81+1x80)10=(448+40+1)10=(489)10 例子2:将八进制数(0.16)8转换成十进制数。

二进制十进制八进制十六进制转换练习题

数制及相互转换 进制表示形式R代表任意进制 二进制 B R→十:按权展开求和二→八:三位变一位 八进制O (Q) 十→R:除R 取余倒排二→十六:四位变一位 十进制 D 八→二:一位变三位 十六进制H 十六→二:一位变四位 一、单选题 1、下列数据中数值最小的是 A、01110000B B、249D C、125Q D、AAH 2、下列数据中数值最大的是 A、3FH B、64D C、77Q D、111110B 3、下列数据中数值最大的是 A、100H B、100D C、100Q D、100B 4、十进制数24 转换成二进制数是 A、11100 B、11010 C、11000 D、10100 5、下列数据中数值最小的是 A、11110000(二进制) B、249(十进制) C、274(八进制) D、FA(十六进制) 6、下列数据中数值最大的是 A、11101101(二进制) B、235(十进制) C、351(八进制) D、EE(十六进制) 7、下列各数中最大的是 A、11010110B B、D7 H C、214D D、325Q 8、与二进制数100101 等值的十进制数是 A、34 B、35 C、36 D、37 9、与十进制数256 等值的二进制数是 A、1000000 B、10000000 C、100000000 D、1000000000 10、与十六进制数ACE等值的十进制数是 A、2766 B、2765 C、2764 D、2763 11、十六进制数111 与八进制数111 之和,用八进制数表示为 A、310 B、1222 C、1000 D、532 12、按某种进制运算 2 ×4=1,2那么 4 ×为5 A、20 B、32 C、24 D、12 13、若216 是某种数制的一个数,它的值与十六进制数8E 相等,则该数是()进制数。 A、六 B、八 C、九 D、十 14、下列各数中,属于合法的五进制数的是 A、216 B、123 C、354 D、189 15、下列无符号十进制中,能用8 位二进制表示的是 A、257 B、288 C、256 D、255 16、无符号二进制数后加上一个0,形成的数是原来的几倍? A、 1 B、 2 C、1/2 D、4 17、下列数据中数值最大的是 A、(10000)2 B、(17)8 C、(17)10 D、(10)16 18、某学校有1500 名学生,若用二进制来编学号,需要多少位来表示。 A、10 B、11 C、12 D、13

2.8.16进制转换

二进制数转换为十进制数 二进制数第0位的权值是2的0次方,第1位的权值是2的1次方……所 以,设有一个二进制数:0110 0100,转换为10进制为:下面是竖式:0110 0100 换算成十进制 第0位 0 * 20 = 0,第1位 0 * 21 = 0,第2位 1 * 22 = 4,第3位 0 * 23 = 0,第4位 0 * 24 = 0,第5位 1 * 25 = 32,第6位 1 * 26 = 64,第7位 0 * 27 = 0 + --------------------------- 100,用横式计算为:0 * 20 + 0 * 21 + 1 * 22 + 1 * 23 + 0 * 24 + 1 * 25 + 1 * 26 + 0 * 27 = 100,0乘以多少都 是0,所以我们也可以直接跳过值为0的位:1 * 22 + 1 * 23 + 1 * 25 + 1 * 26 = 100 八进制数转换为十进制数.八进制就是逢8进1。八进制数采用 0~7这八数 来表达一个数。八进制数第0位的权值为8的0次方,第1位权值为8的1 次方,第2位权值为8的2次方……所以,设有一个八进制数:1507,转换 为十进制为:用竖式表示:1507换算成十进制。第0位 7 * 80 = 7,第1位 0 * 81 = 0 ,第2位 5 * 82 = 320 ,第3位 1 * 83 = 512 + -------------------------- 839,同样,我们也可以用横式直接计算:7 * 80 + 0 * 81 + 5 * 82 + 1 * 83 = 839.结果是,八进制数 1507 转换成十进制数为 839. 十六进制数转换成十进制数,2进制,用两个阿拉伯数字:0、1;8进 制,用八个阿拉伯数字:0、1、2、3、4、5、6、7;10进制,用十个阿拉伯 数字:0到9;16进制,用十六个阿拉伯数字……等等,阿拉伯人或说是印度人,只发明了10个数字啊?16进制就是逢16进1,但我们只有0~9这十个 数字,所以我们用A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,15。字母不区分大小写。十六进制数的第0位的权值为16的0次 方,第1位的权值为16的1次方,第2位的权值为16的2次方……所以,

十六进制数转换为二进制数程序

十六进制数转换为二进制数程序 程序: CRLF MACRO ;宏定义 PUSH AX ;把AX压入堆栈 PUSH DX ;把DX压入堆栈 MOV AH, 02H ;显示回车 MOV DL, 0DH INT 21H MOV AH, 02H ;显示换行 MOV DL, 0AH INT 21H POP DX ;弹出DX POP AX ;弹出AX ENDM DATA SEGMENT ;数据段 MESS DB 'INPUT HEXNUMBER:', '$' ERROR DB 'INPUT ERROR', 0DH, 0AH, '$' DATA ENDS STACK SEGMENT ;堆栈段 STA DW 32 DUP(?) TOP DW ? STACK ENDS CODE SEGMENT ;代码段 ASSUME CS: CODE, DS: DATA, ES: DATA, SS: STACK START: MOV AX, DATA ;初始化 MOV DS, AX MOV ES, AX MOV SP, TOP LLL: MOV AH, 09H ;显示提示信息 MOV DX, OFFSET MESS ;把MESS的偏移地址给DX INT 21H CRLF XOR DX, DX ;DX清零 MOV BL, 04H ;接收字符个数 GGG: MOV AH, 01H ;接收字符 INT 21H CMP AL, 0DH ;AL-0DH(判断是不是回车) JZ PPP ;是回车,转PPP CMP AL, 20H ;AL-20H(判断是不是空格) JZ PPP ;是空格,转PPP CMP AL, 30H ;AL-30H(判断是不是ASCII码0) JB KKK ;不是,转KKK SUB AL, 30H ;AL=AL-30H(将ASCII码转换成十六进制数) CMP AL, 0AH ;AL-0AH

二进制、八进制、十六进制

二进制、八进制、十六进制 6.6通过调试查看变量的值下面我们来动手完成一个小小的实验,通过调试,观察变 量的值。我们在代码中声明两个int变量,并分别初始化为5和-5。然后我们通过CB 提供的调试手段,可以查看到程序运行时,这两个变量的十进制值和十六进制值。首先新 建一个控制台工程。加入以下黑体部分(就一行)://------------------------------ ---------------------------------------------#pragmahdrstop//----------------- ---------------------------------------------------------- #pragmaargsusedintmain(intargc,char*argv[]){intaaaa=5,bbbbb=-5;return0;}//---- -----------------------------------------------------------------------没有我 们熟悉的的那一行:getchar();所以,如果全速运行这个程序,将只是DOS窗口一闪而过。不过今天我们将通过设置断点,来使用程序在我们需要的地儿停下来。设置断点:最 常用的调试方法之一,使用程序在运行时,暂停在某一代码位置,在CB里,设置断点的 方法是在某一行代码上按F5或在行首栏内单击鼠标。如下图:在上图中,我们在 return0;这一行上设置断点。断点所在行将被CB以红色显示。接着,运行程序(F9),程序 将在断点处停下来。(请注意两张图的不同,前面的图是运行之前,后面这张是运行中, 左边的箭头表示运行运行到哪一行)当程序停在断点的时,我们可以观察当前代码片段内,可见的变量。观察变量的方法很多种,这里我们学习使用DebugInspector(调试期检视),来全面观察一个变量。以下是调出观察某一变量的DebugInspector窗口的方法:先确保 代码窗口是活动窗口。(用鼠标点一下代码窗口)按下Ctrl键,然后将鼠标挪到变量aaaa 上面,你会发现代码中的aaaa变蓝,并且出现下划线,效果如网页中的超链接,而鼠标 也变成了小手状点击鼠标,将出现变量aaaa的检视窗口:笔者使用的操作系统为WindowsXP,窗口的外观与Win9X有所不同)从该窗口,我可以看到:aaaa:变量名int:变量的数据类型0012FF88:变量的内存地址,请参看5.2变量与内存地址;地址总是使用十六 进制表达5:这是变量的值,即aaaa=5;0xXX:同样是变量的值,但采用16进制表示。因 为是int类型,所以占用4字节。首先先关闭前面的用于观察变量aaaa的DebugInspector窗口。现在,我们用同样的方法来观察变量bbbb,它的值为-5,负数在计 算机中使用补码表示。正如我们所想,-5的补码为:0xFFFFFFFB。再按一次F9,程序将 从断点继续运行,然后结束。

微机实验--十六进制数转换为二进制数程序

一、实验目的 掌握键盘接收数据的方法,并了解键盘数据显示时需要转换为ASCII码及转换原理。 二、实验内容 编写程序,将键盘键入的四位十六进制数转换为等值的二进制数,并在屏幕上显示。 三、程序流程图 十六进制数转换为二进制数程序流程图

四、实验源程序 CRLF MACRO PUSH AX PUSH DX MOV AH,02H MOV DL,0DH INT 21H MOV AH,02H MOV DL,0AH INT 21H POP DX POP AX ENDM DATA SEGMENT MESS DB 'INPUT HEXNUMBER:','$' ERROR DB 'INPUT ERROR',0DH,0AH,'$' DATA ENDS STACK SEGMENT STA DW 32 DUP(?) TOP DW ? STACK ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK START: MOV AX,DATA MOV DS,AX MOV ES,AX MOV SP,TOP LLL: MOV AH,09H MOV DX,OFFSET MESS INT 21H CRLF XOR DX,DX MOV BL,04H GGG: MOV AH,01H INT 21H

JZ PPP CMP AL,20H JZ PPP CMP AL,30H JB KKK SUB AL,30H CMP AL,0AH JB KKK SUB AL,07H CMP AL,0FH JBE GETS CMP AL,2AH JB KKK CMP AL,2FH JA KKK SUB AL,20H GETS: MOV CL,04H SHL DX,CL XOR AH,AH ADD DX,AX DEC BL JNZ GGG CRLF CALL ZHXS CRLF JMP LLL KKK: PUSH DX CRLF MOV AH,09H MOV DX,OFFSET ERROR INT 21H POP DX PPP: CRLF

二进制,八进制,十进制,十六进制之间的转换算法

二进制,八进制,十进制,十六进制之间的转换算法 一、十进制与二进制之间的转换 (1)十进制转换为二进制,分为整数部分和小数部分 ①整数部分 方法:除2取余法,即每次将整数部分除以2,余数为该位权上的数,而商继续除以2,余数又为上一个位权上的数,这个步骤一直持续下去,直到商为0为止,最后读数时候,从最后一个余数读起,一直到最前面的一个余数。下面举例: 例:将十进制的168转换为二进制 得出结果将十进制的168转换为二进制,(10101000)2 分析:第一步,将168除以2,商84,余数为0。 第二步,将商84除以2,商42余数为0。 第三步,将商42除以2,商21余数为0。 第四步,将商21除以2,商10余数为1。 第五步,将商10除以2,商5余数为0。 第六步,将商5除以2,商2余数为1。 第七步,将商2除以2,商1余数为0。 第八步,将商1除以2,商0余数为1。 第九步,读数,因为最后一位是经过多次除以2才得到的,因此它是最高位,读数字从最后的余数向前读,即10101000 (2)小数部分 方法:乘2取整法,即将小数部分乘以2,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,剩下的小数部分又乘以2,一直取到小数部分 为零为止。如果永远不能为零,就同十进制数的四舍五入一样,按照要求保留多少位小数时,就根据后面一位是0还是1,取舍,如果是零,舍掉,如果是1,向入一位。换句话说就是0舍1入。读数要从前面的整数读到后面的整数,下面举例: 例1:将0.125换算为二进制 得出结果:将0.125换算为二进制(0.001)2 分析:第一步,将0.125乘以2,得0.25,则整数部分为0,小数部分为0.25; 第二步, 将小数部分0.25乘以2,得0.5,则整数部分为0,小数部分为0.5; 第三步, 将小数部分0.5乘以2,得1.0,则整数部分为1,小数部分为0.0; 第四步,读数,从第一位读起,读到最后一位,即为0.001。 例2,将0.45转换为二进制(保留到小数点第四位) 大家从上面步骤可以看出,当第五次做乘法时候,得到的结果是0.4,那么小数部分继续乘以2,得0.8,0.8又乘以2的,到1.6这样一直乘下去,最后不可能得到小数部分为零,因此,这个时候只好学习十进制的方法进行四舍五入了,但是二进制只有0和1两个,于是就出现0舍1入。这个也是计算机在转换中会产生误差,但是由于保留位数很多,精度很高,所以可以忽略不计。

(完整word版)二进制、八进制、十六进制转换方式

第六章二进制、八进制、十六进制 6.1 为什么需要八进制和十六进制? 6.2 二、八、十六进制数转换到十进制数 6.2.1 二进制数转换为十进制数 6.2.2 八进制数转换为十进制数 6.2.3 八进制数的表达方法 6.2.4 八进制数在转义符中的使用 6.2.5 十六进制数转换成十进制数 6.2.6 十六进制数的表达方法 6.2.7 十六进制数在转义符中的使用 6.3 十进制数转换到二、八、十六进制数 6.3.1 10进制数转换为2进制数 6.3.2 10进制数转换为8、16进制数 6.4 二、十六进制数互相转换 6.5 原码、反码、补码 6.6 通过调试查看变量的值 6.7 本章小结 这是一节“前不着村后不着店”的课。不同进制之间的转换纯粹是数学上的计算。不过,你不必担心会有么复杂,无非是

乘或除的计算。 生活中其实很多地方的计数方法都多少有点不同进制的影子。 比如我们最常用的10进制,其实起源于人有10个指头。如果我们的祖先始终没有摆脱手脚不分的境况,我想我们现在一定是在使用20进制。 至于二进制……没有袜子称为0只袜子,有一只袜子称为1只袜子,但若有两袜子,则我们常说的是:1双袜子。 生活中还有:七进制,比如星期。十六进制,比如小时或“一打”,六十进制,比如分钟或角度…… (该版课程的内容更新及订正均已停止) 旧版课程打包下载 ---------------------------------- [想看涵盖“面向对象”、“图形编程”、“泛型编程”…… 的“最新2008年版白话C++”课程,请点击!] (另有: 博客版) 6.1 为什么需要八进制和十六进制? 编程中,我们常用的还是10进制……必竟C/C++是高级语言。 比如:

二进制、八进制、十进制和十六进制关系

二进制、八进制、十进制和十六进制关系 为什么需要八进制和十六进制? 由于数据在计算机中的表示,最终以二进制的形式存在,所以有时候使用二进制,可以更直观地解决问题。但二进制数太长了。面对太长的数进行思考或操作,没有人会喜欢。 用16进制或8进制可以解决这个问题。因为,进制越大,数的表达长度也就越短。不过,为什么偏偏是16或8进制,而不其它的,诸如9或20进制呢? 因为2、8、16,分别是2的1次方、3次方、4次方。这一点使得三种进制之间可以非常直接地互相转换。8进制或16进制缩短了二进制数,但保持了二进制数的表达特点。 1234=1*10+2*10+3*10+4*10 32=1*2+0*2+0*2+0*2+0*2+0*2可以看出,所有进制换算成10进制,关键在于三个因素:进制基数、权位和权值。 如何将二、八、十六进制数转换为十进制数。 (一)二进制数转换成十进制数 由二进制数转换成十进制数的基本做法是,把二进制数首先写成加权系数展开式,从最后一位开始算,依次列为第0、1、2...n位,第n位的数(0或1)乘以基数2的n次方,然后按十进制加法规则求和,得到的结果就是答案。这种做法称为"按权相加"法。 例1:(01100100)2=(100)10 计算过程:0*20+0*21+1*22+1*23+0*24+1*25+1*26+0*27= 0乘以多少都是0,所以也可直接跳过值为0的位:1*22+1*23+1*25+1*26=100 例2:(1011.01)2=(1×23+0×22+1×21+1×20+0×2-1+1×2-2)10=(8+0+2+1+0+0.25)10=(11.25)10例3:(101.101)2=(5.625)10 (二)8进制数转换为10进制数,也按"按权相加"法,只将基数换成8即可。 例:(1507)8=(839)10 计算过程:1*83+5*82+0*81+7*80=839 (三)16进制数转换成10进制数,也按"按权相加"法,只将基数换成16即可。 例:(2AF5)16=(10997)10, 计算过程:2*163+A*162+F*161+5*160=10997(A表示10,F表示15) 附表1十进制与二进制、八进制、十六进制关系表

二进制如何转十六进制

二进制如何转十六进制 二进制数的书写通常在数的右下方注上基数2,或加后面加B表示。八进制用下标8或数据后面加Q表示。通常在表示时用尾部标志H或下标16以示区别。 1、二进制数、八进制数、十六进制数转十进制数 有一个公式:二进制数、八进制数、十六进制数的各位数字分别乖以各自的基数的(N-1)次方,其和相加之和便是相应的十进制数。个位,N=1;十位,N=2...举例: 110B=1*2的2次方+1*2的1次方+0*2的0次方=0+4+2+0=6D 110Q=1*8的2次方+1*8的1次方+0*8的0次方=64+8+0=72D 110H=1*16的2次方+1*16的1次方+0*16的0次方=256+16+0=272D 2、十进制数转二进制数、八进制数、十六进制数 方法是相同的,即整数部分用除基取余的算法,小数部分用乘基取整的方法,然后将整数与小数部分拼接成一个数作为转换的最后结果。 例:见四级指导16页。 3、二进制数转换成其它数据类型 ⑴二进制转八进制:从小数点位置开始,整数部分向左,小数部分向右,每三位二进制为一组用一位八进制的数字来表示,不足三位的用0补足,就是一个相应八进制数的表示。 010110.001100B=26.14Q 八进制转二进制反之则可。 ⑵二进制转十进制:见1 ⑶二进制转十六进制:从小数点位置开始,整数部分向左,小数部分向右,每四位二进制为一组用一位十六进制的数字来表示,不足四位的用0补足,就是一个相应十六进制数的表示。 00100110.00010100B=26.14H 4、十进制转各进制 要将十进制转为各进制的方式,只需除以各进制的权值,取得其余数,第一次的余数当个位数,第二次余数当十位数,其余依此类推,直到被除数小于权值,最后的被除数当最高位数。 一、十进制转二进制

十进制、二进制、八进制、十六进制之间的转换doc

十进制转二进制: 用 2 辗转相除至结果为 1 将余数和最后的 1 从下向上倒序写 就是结果 例如 302 302/2 = 151 余 0 151/2 = 75 余 1 75/2 = 37 余 1 37/2 = 18 余 1 18/2 = 9 余 0 9/2 = 4 余 1 4/2 = 2 余 0 2/2 = 1 余 0 故二进制为 100101110 二进制转十进制 从最后一位开始算,依次列为第 0、1、2...位 第 n 位的数(0 或 1)乘以 2 的 n 次方 得到的结果相加就是答案 例如:01101011.转十进制: 第 0 位:1 乘 2 的 0 次方=1 1 乘 2 的 1 次方=2 0 乘 2 的 2 次方=0 1 乘 2 的 3 次方=8 0 乘 2 的 4 次方=0 1 乘 2 的 5 次方=32 1 乘 2 的 6 次方=64 0 乘 2 的 7 次方=0 然后:1+2+0 +8+0+32+64+0=107.
二进制 01101011=十进制 107.
二进制转十进制,十进制转二进制的算法
https://www.360docs.net/doc/9014164631.html, 阅读:
5915 时间:2008-6-16 6:02:10 整理:华 夏黑盟
-----------------------------------------------------------------

二进制转十进制,十进制转二进制的算法 十进制转二进制: 用 2 辗转相除至结果为 1 将余数和最后的 1 从下向上倒序写 就是结果 例如 302 302/2 = 151 余 0 151/2 = 75 余 1 75/2 = 37 余 1 37/2 = 18 余 1 18/2 = 9 余 0 9/2 = 4 余 1 4/2 = 2 余 0 2/2 = 1 余 0 故二进制为 100101110 二进制转十进制 从最后一位开始算,依次列为第 0、1、2...位 第 n 位的数(0 或 1)乘以 2 的 n 次方 得到的结果相加就是答案 例如:01101011.转十进制:

基于Java的16进制数与2进制数互相转化方法

//十六进制数转二进制数 import java.util.Scanner; publicclass H_to_B { staticvoid HtoB_fun(String n){ char[] ch=n.toCharArray(); char str; String s=""; int p=0; for(int i=0;i='0'&&str<='9'){ String st= Character.toString(str);//字符转字符串 p=Integer.valueOf(st).intValue();//字符串转整型} else{ if(str=='A'){str=10;} if(str=='B'){str=11;} if(str=='C'){str=12;} if(str=='D'){str=13;} if(str=='E'){str=14;} if(str=='F'){str=15;} if(str=='.'){str=16;} p=(int)str; } switch (p){ case 0 : s+="0000"; break; case 1 : s+="0001"; break; case 2 : s+="0010"; break; case 3 : s+="0011"; break;

case 4 : s+="0100"; break; case 5 : s+="0101"; break; case 6 : s+="0110"; break; case 7 : s+="0111"; break; case 8 : s+="1000"; break; case 9 : s+="1001"; break; case 10 : s+="1010"; break; case 11 : s+="1011"; break; case 12 : s+="1100"; break; case 13 : s+="1101"; break; case 14 : s+="1110"; break; case 15 : s+="1111"; break; case 16 : s+="."; break; default : System.out.println("error!");

二进制、八进制、十进制与十六进制转换计算精华复习过程

二进制、八进制、十进制与十六进制转换 计算精华

三、二进制转化成其他进制 1.二进制(Binary)——>八进制(Octal) 例子1:将二进制数(10010)2转化成八进制数。 (10010)2=(010 010)2=(2 2)8=(22)8 例子2:将二进制数(0.10101)2转化为八进制数。 (0.10101)2=(0. 101 010)2=(0. 5 2)8=(0.52)8 诀窍:因为每三位二进制数对应一位八进制数,所以,以小数点为界,整数位则将二进制数从右向左每3位一隔开,不足3位的在左边用0填补即可;小数位则将二进制数从左向右每3位一隔开,不足3位的在右边用0填补即可。 2.二进制(Binary)——>十进制(Decimal) 例子1:将二进制数(10010)2转化成十进制数。 (10010)2=(1x24+0x23+0x22+1x21+0x20)10=(16+0+0+2+0)10=(18) 10

例子2:将二进制数(0.10101)2转化为十进制数。 (0.10101)2=(0+1x2-1+0x2-2+1x2-3+0x2-4+1x2-5)10=(0+0.5+0.25+0.125+0.0625+0.03125)10=(0.96875)10 诀窍:以小数点为界,整数位从最后一位(从右向左)开始算,依次列为第0、1、2、3………n,然后将第n 位的数(0或1)乘以2的n-1次方,然后相加即可得到整数位的十进制数;小数位则从左向右开始算,依次列为第1、2、3……..n,然后将第n位的数(0或1)乘以2的-n次方,然后相加即可得到小数位的十进制数(按权相加法)。 3.二进制(Binary)——>十六进制(Hex) 例子1:将二进制数(10010)2转化成十六进制数。 (10010)2=(0001 0010)2=(1 2)16=(12) 16 例子2:将二进制数(0.10101)2转化为十六进制数。 (0.10101)2=(0. 1010 1000)2=(0. A 8)16=(0.A8)16 诀窍:因为每四位二进制数对应一位十六进制数,所以,以小数点为界,整数位则将二进制数从右向左每4位一隔开,不足4位的在左边用0填补即可;小数位则将二进制数从左向右每4位一隔开,不足4位的在右边用0填补即可。 (10010)2=(22)8=(18) 10=(12)16 (0.10101)2=(0.52)8=(0.96875)10=(0.A8)16 四、八进制转化成其他进制 1.八进制(Octal)——>二进制(Binary) 例子1:将八进制数(751)8转换成二进制数。 (751)8=(7 5 1)8=(111 101 001)2=(111101001)2 例子2:将八进制数(0.16)8转换成二进制数。

相关文档
最新文档