精华内容
下载资源
问答
  • 计算机中使用的数据可分成两大类: 符号数据:非数字符号的表示(ASCII、汉字、图形等) 数值数据:数字数据的表示方式(定点、...二进制0和1两个数码来表示。它的基数为2,逢二进一。是计算技术中广泛采用的...

    计算机中使用的数据可分成两大类:

    • 符号数据:非数字符号的表示(ASCII、汉字、图形等)
    • 数值数据:数字数据的表示方式(定点、浮点)

    数据格式:

    • 二进制:用0和1两个数码来表示的数。它的基数为2,逢二进一。是计算技术中广泛采用的一种数制。
    • 八进制:用3位二进制表示八进制,它的基数为8,逢8进一。
    • 十六进制:用4位二进制表示十六进制,它的基数为16,逢16进一。使用 0-9 A-F 分别表示10进制的 0-9 10-15。
    二进制 八进制 十六进制 十进制
    0000 0 0 0
    0001 1 1 1
    0010 2 2 2
    0011 3 3 3
    0100 4 4 4
    0101 5 5 5
    0110 6 6 6
    0111 7 7 7
    1000 10 8 8
    1001 11 9 9
    1010 12 A 10
    1011 13 B 11
    1100 14 C 12
    1101 15 D 13
    1110 16 E 14
    1111 17 F 15
    进制转换:

    10进制和R进制之间的转换

    • R进制到10进制:
      i=nmki×ri \sum_{i=n}^{-m} k_i × r^i

    • 10进制到R进制:
      整数部分:除r取余,r为进制基数
      小数部分:乘r取整

    10进制整数转任意进制整数(C++代码)
    #include <iostream>
    using namespace std;
    
    
    // 字符串反转
    void StrReverse(char* str)
    {
    	char tmp;
    	int len = strlen(str);
    	for (int i = 0, j = len - 1; i <= j; i++, j--)
    	{
    		tmp = str[i];
    		str[i] = str[j];
    		str[j] = tmp;
    	}
    	str[len] = '\0';
    }
    
    //十进制转任意进制(小于等于36)
    void DecToArbitrary(int num, int radix, char* str)
    {
    	if (radix <= 0)	return;
    	str[0] = '0';		// 0 ==》 0
    	bool flag = false;	/* 负数 */
    	if (num < 0) { num *= -1;	flag = true; }
    	
    	int i = 0;
    	char ch[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    	while (num != 0)
    	{
    		str[i++] = ch[(num % radix)];
    		num /= radix;
    	}
    	
    	if (flag)	str[i] = '-';
    	StrReverse(str);
    }
    
    int main()
    {
    	char str[100] = "";
    
    	/* 
    		DecToArbitrary(num, r , str);
    		将10进制装换为 r 进制
    		num(10) ==> str(r)
    	*/
    	DecToArbitrary(32, 16, str);
    	cout << "hex: " str << endl;
    
    	return 0;
    }
    
    任意进制整数转10进制整数(C++代码)
    #include <iostream>
    using namespace std;
    
    // 幂函数
    int myPow(int x, int n)
    {
    	unsigned int z = (n >= 0 ? n : -n);
    
    	for (int tmp = 1; ; x *= x)
    	{
    		if ((z & 1) != 0)
    		{
    			tmp *= x;
    		}
    		if ((z >>= 1) == 0)
    		{
    			return n >= 0 ? tmp : 1.0 / tmp;
    		}
    	}
    }
    
    
    //任意进制转十进制(小于等于36)
    /* str(r) ==> num(10)   */
    void ArbitraryToDec(char* str, int radix, int& num)
    {
    	num = 0;		// 0 ==》 0
    	if (NULL == str || radix < 0 )	return;
    	int len = strlen(str);
    	int i =  len - 1;
    	int sum = 0;
    				/* 
    					A, B, C, D ...    ascii 65-90 
    					a, b, c, d ...    ascii 97-128
    				*/
    	char ch[] = {10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35};
    
    	while (i >= 0 && isalnum(str[i]))
    	{
    		int n = 0;
    		if (isalpha(str[i]))	// 字母
    		{
    			int t = 65;
    			if (islower(str[i]))	t = 97;
    			n = ch[str[i] - 0 - t];
    
    			if (n >= radix)		// error:数位大于进制
    			{
    				sum = -1;
    				break;
    			}
    		}
    		else if (isdigit(str[i]))	// 数字
    		{
    			n = str[i] - '0';
    		}
    
    		sum += n * myPow(radix,len - i -1); 
    		i--;
    	}
    
    	if (str[0] == '-') sum *= -1;
    	num = sum;
    }
    
    int main()
    {
    	int num = 0;
    	char str[128] = "";
    	
    	/*
    		ArbitraryToDec(str, r, num);
    		将r进制为10装换
    		str(r) ==> num(10)
    	*/
    	cin >> str;
    	ArbitraryToDec(str, 16, num);
    	cout << "dec: " << num << endl;
    
    	return 0;
    }
    
    浮点数 IEEE 754

    IEEE754标准(规定了浮点数的表示格式,运算规则等)

    • 规则规定了单精度(32)和双精度(64)的基本格式.
    • 规则中,尾数用原码,指数用移码(便于对阶和比较)
      在这里插入图片描述
      浮点数的表示:
      在这里插入图片描述
      ——图片来自MOOC

    32位的浮点数:

    • S数的符号位,1位,在最高位,“0”表示正数,“1”表示负数。
    • M是尾数, 23位,在低位部分,采用纯小数表示
    • E是阶码,8位,采用移码表示。移码比较大小方便。
    • 规格化: 若不对浮点数的表示作出明确规定,同一个浮点数的表示就不是惟一的。
      尾数域最左位(最高有效位)总是1, 故这一位经常不予存储,而认为隐藏在小数点的左边。
      采用这种方式时,将浮点数的指数真值e变成阶码E时,应将指数e加上一个固定的偏移值127(01111111),即E=e+127

    64位的浮点数
    符号位1位,阶码域11位,尾数域52位,指数偏移值是1023。因此规格化的64位浮点数x的真值为:
    x=(1)S×(1.M)×2E1023x=(-1)^S×(1.M)×2^{E-1023}
    e=E-1023
    一个规格化的32位浮点数x的真值表示为
    x=(1)S×(1.M)×2E127x=(-1)^S×(1.M)×2^{E-127}
    e=E-127

    例1:已知754标准存储格式十六进制,求浮点数十进制数值

    若浮点数x的754标准存储格式为(41360000)16,求其浮点数的十进制数值。
    解:

    • 将16进制数展开后,可得二制数格式为
      0       100 00010          011011000000000000000000\ \ \ \ \ \ \ 100\ 00010\ \ \ \ \ \ \ \ \ \ 011 0110 0000 0000 0000 0000
      S       (8)         (23)S\ \ \ \ \ \ \ 阶码(8位)\ \ \ \ \ \ \ \ \ 尾数(23位)
    • 指数e=阶码-127=10000010-01111111=00000011=(3)10
    • 包括隐藏位1的尾数
      1.M=1.011 0110 0000 0000 0000 0000=1.011011
    • 于是有
      x=(1)S×1.M×2e=+(1.011011)×23=+1011.011=(11.375)10x=(-1)S×1.M×2^e=+(1.011011)×2^3=+1011.011=(11.375)_{10}

    C++代码实现

    #include <iostream>
    #include <bitset>
    using namespace std;
    
    void hex_to_float()
    {
    	// 将16进制转换为2进制
    	unsigned long long num = 0x0;
    	cin >> hex >> num;
    	bitset<32> bit(num);
    
    	// 将2进制准换为float类型
    	float res = *(float*)&bit;
    
    	cout << res << endl;		// 输出10进制浮点数形式
    	cout << bit << endl;		// 输出IEEE 754 格式二进制
    }
    
    int main()
    {
    
    	hex_to_float();
    	/*
    	输入: 0x41360000 或 41360000
    	输出:
    	11.375
    	01000001001101100000000000000000
    	*/
    
    	return 0;
    }
    
    例2:将十进制浮点数转换为754标准的32位浮点数的二进制存储格式

    将数(20.59375)10转换成754标准的32位浮点数的二进制存储格式。
    解:

    • 首先分别将整数和分数部分转换成二进制数:
      20.59375=10100.1001120.59375=10100.10011
    • 然后移动小数点,使其在第1,2位之间
      10100.10011=1.010010011×2410100.10011=1.010010011×2^4
      e=4于是得到:S=0, E=4+127=131, M=010010011
    • 最后得到32位浮点数的二进制存储格式为:
      01000001101001001100000000000000=(41A4C000)16

    C++代码实现

    #include <iostream>
    #include <bitset>
    using namespace std;
    
    void float_to_bin()
    {
    		float fa;
    		cin >> fa;	// 取 fa 地址,强转为 uint64_t 类型地址,解引用为 uint64_t 类型 
    		unsigned long long tmp = *(unsigned long long*) & fa;
    		bitset<32> bin(tmp);
    		cout << bin << endl;
    }
    
    void float_to_hex()
    {
    	float fa;
    	cin >> fa;
    	unsigned long long tmp = *(unsigned long long*) & fa;
    	bitset<32> bin(tmp);
    
    	bitset<32> bit(bin);
    	unsigned long a = bit.to_ullong();	// bitset 转 usigned long long
    	cout << hex<< a << endl;
    }
    
    int main()
    {
    
    	float_to_bin();
    	/*
    	输入:20.59375
    	输出:01000001101001001100000000000000
    	*/
    	float_to_hex();
    	/*
    	输入:20.59375
    	输出:41a4c000
    	*/
    	return 0;
    }
    

    数的机器码表示
    真值:一般书写的数
    机器码:机器中表示的数, 要解决在计算机内部数的正、负符号和小数点运算问题。

    • 原码:符号位加上真值
    • 反码:除符号为,其余位皆取反
    • 补码:反码+1。
    • 移码:对补码符号位取反

    注:正数的原码、反码、补码、移码都相同,并且在计算机中存储带有符号的数都是以补码形式存储,用补码形式进行运算的。

    如:
    [ 1] = [0000 0001]原 = [0000 0001]反 = [0000 0001]补 = [0000 0001]移
    [-1] = [1000 0001]原 = [1111 1110]反 = [1111 1111]补 = [0111 1111]移


    附:
    bitset: C ++标准库参考/C ++标准库头文件/bitset Class

    展开全文
  •   其中针对于单精度浮点数,S为符号位,只占1位,为0表示正数,为1表示负数。P为指数(阶码),移码表示,占8位。M为尾数,原码表示,占23位。 2、浮点数规格化表示:当尾数的值不为0时,规定尾数域的最高有效...

    C语言:IEEE754十进制数转二进制单精度浮点数


    1. 背景知识

    1. IEEE754是由IEEE制定的有关浮点数的工业标准。针对于单精度浮点数,其公式如下,S为符号位,只占1位,为0表示正数,为1表示负数。P为指数(阶码),用移码表示,占8位。M为尾数,用原码表示,占23位。

    X = (-1)S * 1.M * 2P-127

    1. 浮点数规格化表示:当尾数的值不为0时,规定尾数域的最高有效位为1,不符合规定的则将阶码左移或右移小数点位置。

    2. 程序代码

    //编程环境:
    //    操作系统:windows 7
    //    编程工具:VS2017
    //    编程语言:c/c++语言
    
    #include "pch.h"
    #include <iostream>
    #include <stdio.h>
    
    //整数转r进制
    //integer:整数 radix:进制 result:结果数组 num:生成r进制所占位数
    void D1toB(int integer, int radix, int result[], int &num)
    {
    	int i, j, n;
    	for (i = 0; integer > 0; i++)//除r取余
    	{
    		result[i] = integer % radix;
    		integer = integer / radix;
    	}
    	num = i;//r进制位数
    	for (j = 0; j < i / 2; j++)//颠倒顺序 
    	{
    		n = result[j];
    		result[j] = result[i - 1 - j];
    		result[i - 1 - j] = n;
    	}
    }
    
    //小数转r进制
    //decimal:小数 radix:进制 result:结果数组 num:生成r进制所占位数
    void D2toB(double decimal, int radix, int result[], int &num)
    {
    	int i;
    	for (i = 0; decimal > 0 && i < 50; i++)//乘r取整
    	{
    		result[i] = decimal * radix;
    		decimal = decimal * radix;
    		decimal = decimal - int(decimal);
    	}
    	num = i;
    }
    
    int main()
    {
    	int integer;//整数部分 
    	double decimal;//小数部分 
    	int s, p[8], m[50];//浮点数符号位,阶码数,尾数 
    
    	while (true)
    	{
    		double number;//输入的浮点数 
    		printf("请输入一个浮点数:");
    		scanf_s("%lf", &number);
    		getchar();
    
    		int i, j;
    		for (i = 0; i < 8; i++)//清零
    		{
    			p[i] = 0;
    		}
    		for (i = 0; i < 50; i++)
    		{
    			m[i] = 0;
    		}
    
    		//确定符号位 
    		if (number > 0)
    		{
    			s = 0;
    		}
    		else
    		{
    			s = 1;
    			number = -number;
    		}
    		//将浮点数分成整数和小数 
    		integer = (int)number;
    		decimal = number - integer;
    		//分别将整数和小数转化成二进制 
    		int m_n1, m_n2;
    		D1toB(integer, 2, m, m_n1);
    		D2toB(decimal, 2, m + m_n1, m_n2);
    		//规格化,计算阶数, 尾数
    		int pn = 0;//阶数 
    		
    		if (integer > 0)//小数点左移
    		{
    			pn = m_n1 - 1;//阶数 
    			for (i = 0; i < 23; i++)//去掉首位默认的1
    			{
    				m[i] = m[i + 1];
    			}
    		}
    		else//小数点右移
    		{
    			for (i = 0; m[i] == 0; i++)
    			{
    			}
    			pn = -i -1;
    			for (j = 0; j < 23; j++)//去掉左边无效的0和第一个的1
    			{
    				m[j] = m[j + 1 + i];
    			}
    		}
    		//计算阶码
    		int p1[8], pn1;
    		D1toB(pn + 127, 2, p1, pn1);//阶数转二进制 
    		if (pn1 < 8)//不足8位左边补0 
    		{
    			for (j = 0; j < 8 - pn1; j++)
    			{
    				p[j] = 0;
    			}
    			for (int k = 0; k < pn1; k++)//得出完整p 
    			{
    				p[j + k] = p1[k];
    			}
    		}
    		else
    		{
    			for (i= 0; i < 8; i++)//得出完整p 
    			{
    				p[i] = p1[i];
    			}
    		}
    
    		//输出s
    		printf("%d ", s); 
    		//输出p
    		for (i = 0; i < 8; i++)
    		{
    			printf("%d", p[i]);
    		}
    		printf(" "); //输出s
    		//输出m
    		for (i = 0; i < 23; i++)
    		{
    			printf("%d", m[i]);
    		}
    		printf("\n\n");
    	}
    	return 0;
    
    }
    

    运行结果

    提示:此程序为个人编写,结果仅作参考,若有不对之处,请指正。

    展开全文
  • 1.5 二进制表示浮点数

    2019-03-22 14:04:02
    Chapter1: 位运算的奇技淫巧 5. 二进制表示浮点数 问题 给定一个介于0和1之间的实数(如0.625),类型为double,打印它的二进制表示(0.101,因为...感觉这题跟位运算关系不大,就是按照用二进制表示浮点数的算法,...
        

    Chapter1: 位运算的奇技淫巧

    5. 二进制表示浮点数

    问题

    给定一个介于0和1之间的实数(如0.625),类型为double,打印它的二进制表示(0.101,因为小数点后的二进制分别表示2^(-1), 2^(-2), 2^(-3)...)

    如果该数字无法精确地用32位以内的二进制表示,则打印"ERROR"

    算法

    感觉这题跟位运算关系不大,就是按照用二进制表示浮点数的算法,用字符串拼接的方法进行编程

    思路:将该浮点数 *2 得到一个新的数 num,如果 num > 1 则在0. 后拼接上1, 否则拼接上 0, 循环直至 num==0

    string binaryDouble(double num){
        string s="0.";//#include<string>
        while(num!=0){
            num*=2;
            if(num>=1){
                s+="1";
                num-=1;
            }
            else{
                s+="0";
            }
            if(s.length()==34){
                return "ERROR";
            }
        }
        
        return s;
        
    }
    

    参考资料

    [1] 二进制表示浮点数

    [2] C++字符串

    展开全文
  • 直接上代码,步骤都在注释里,有问题欢迎留言 public class FloatInBinary { public static void ...//0.3无法32位的二进制数精确表示 double num2=0.625; StringBuilder str=new StringBuilder("0."); ...

    直接上代码,步骤都在注释里,有问题欢迎留言

    public class FloatInBinary {
    
    	public static void main(String[] args) {
    		double num=0.3;//0.3无法用32位的二进制数精确表示
    		double num2=0.625;
    		StringBuilder str=new StringBuilder("0.");
    		
    		
    		/*思路:乘二挪整
    		 * 乘二:直到数字为0为止
    		 * 整:如果整数部分有1则保留
    		 * 挪:整数部分归零
    		 * */
    		
    		while(num>0)
    		{
    			double r=num*2;
    			//判断整数部分
    			if(r>=1)
    			{
    				str.append("1");
    				//消掉整数部分
    				num=r-1;
    			}
    			else {
    				str.append("0");
    				num=r;
    			}
    			
    			if(str.length()>34)
    			{
    				System.out.println("ERROR");
    				return;
    			}
    		}
    			System.out.println(str.toString());
    		
    	}
    }
    
    展开全文
  • 可以Qm.n表示法进行表示.m位为整数部分n位小数部分有符号的总位数N = m + n + 1当n=0时,则定点用来存储整数。定点(整数)定点可以用来存储整数,包括正整数和负整数。定点(整数)表示的常见格式有unsigned ...
  • 题目:将32位浮点数 01000010111011010000000000000000 转换为十进制格式根据国际标准IEEE 754,任意一个二进制浮点数V可以表示成下面的形式:(1)(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。(2)M表示有效...
  • 首先,我们先看下整数,对于十进制整数10,用二进制表示就是1010=1*2^3+0*2^2+1*2^1+0*2^0,所以对于整数,十进制和二进制之间的转化还是挺直接的。那么对于小数,该如何转化呢? 比如,对于3.3,如何转化为二进制...
  • 十六进制表示浮点数的方法  2011-05-13 15:30:10| 分类: 学习资料|字号 订阅 在二进制文件中,存储数据的格式为16进制, 下面举例说明27.0f在二进制文件中怎么表示。 float共计32位,折合4字节由...
  • 浮点数转换成二进制数

    千次阅读 2013-09-05 16:55:10
    结合大量的从网上收集而来的资料现整理如下,希望对此知识点感兴趣的pfan有所帮助。...这种结构是一种科学计数法,符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号
  • 二进制数据是0和1两个数码来表示。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是...
  • 文章目录数据数值数据的表示方法定点表示方法浮点数表示方法例子 数据 数值数据的表示方法 定点格式:计算机中所有数据的小数点位置是固定不变的,数值范围有限 浮点格式:小数点的位置随阶码的位置同步而...
  •  十进制数转换为二进制数 十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。  1.1十进制整数转换为二进制整数  十进制整数转换为二进制...
  • 一、浮点数用二进制数表示 1、补充:十进制数0.4如何转化为二进制数0110 0110(0110循环) float精度有限精确到6~7位 2、、 符号位,位于存储浮点数的最高比特位,且只占1比特。0表示正数,1表示负数。通过改变该...
  • 算法描述:将浮点数左移一位,依次获取每一位,追加到StringBuider里,当StringBuilder长度大于34位时(即浮点数大于32),该无法用二进制精确表示,输出ERROR,否则则将结果输出。 import java.util.Scanner; ...
  • 题目:十进制数1234532位补码整数和32位浮点数(IEEE754标准)表示的结果各是什么(16进制表示) 十进制数12345的32位补码整数为:00003039H 十进制数12345的32位浮点数为:4640E400H 解析: (1)十进制数...
  • 十六进制与浮点数的互相转换 ...3、第22~0 bit共23 bit作为系数,视为二进制纯小数,假定该小数的十进制值为x; 则按照规定,该浮点数的值十进制表示为: = (-1)^s * (1 + x) * 2^(e - 127) 对于4
  • 用二进制表示

    2018-05-10 21:31:00
     浮点数:对于既有整数部分、又有小数部分的,一般用浮点数表示,浮点数的小数点位置是不固定的,可以浮动。  如:234,4563,0.433 0.32134 等是定点 而 454.32 234.5466等是浮点数。  对于定点型整数,...
  • 下面举例说明27.0f在二进制文件中怎么表示。 float 共计32位,折合4字节 由最高到最低位分别是第31、30、29、……、0位 31位是符号位,1表示为负,0反之。 30-23位,一共8位是指位。 22-0位,一共23位是...
  • 二进制中负数的表示

    千次阅读 2017-03-18 18:11:31
    计算机对有符号数(包括浮点数)的表示有三种方法:原码、反码和补码, 补码=反码+1。 在 二进制里,是 0 和 1 来表示正负的,最高位为符号位,最高位为 1 代表负数,最高位为 0 代表...反码:将二进制数按位取反,
  • 这里我一个直观的实例解释float浮点数在intel机器上的存储方式,并给出计算方法,让人能一目了然的明白如何将二进制存储的浮点数的转换成我们常见的十进制形式,并解释为何有的浮点数不能被精确表示,如12.34常常...
  • 定点表示 纯小数:小数点位于符和第一数值位之间时,机器内的为纯小数,表示范围:-(1-2-n)~(1-2-n) 纯整数:小数点位于数值位之后,表示范围:-(2n-1)~(2-n-...计算机规定浮点数尾数纯小数形式 例如: N=...
  • 前面我有篇博文详解了二进制数,以及如何同二进制数表示整数。但是,计算机处理的不仅仅是整数,还有小数,同样小数在计算机也是二进制进行存储的,但是,二进制如何去存储小数呢?计算机对于小数的计算又是否真的...
  • 关于字节与位: 一个int占4个字节(byte),一个字节占8位(bit),所以一个int占用4x8=32位。 char类型的范围为什么是-128~127? 有一个整型范围的公式:-2^(n-...char占8位,用二进制表示为 0000 0000 ~ 1111 111...
  • 整数与浮点数二进制表示方式

    千次阅读 2015-06-13 15:45:27
    1、对于无符号,可以认为是不包含负数的原码表示方法,即直接把正数转换成二进制表示;  对于有符号,有三种表示方法  1)补码,最高位的权重为-2^(w-1),这是原码表示的最高位权重是正好相反的。补码是有符号...
  • 首先明确两个概念,机器是指将”+”和”-“数字化的,其中”0”表示”+”,”1”表示”-“。而对应的有”+”和”-“的则称为真值。 机器表示方法:1、原码表示法 符号位0表示正数,符号位1表示负数。...
  • 单精度浮点数转化为10进制数的原理

    千次阅读 2020-09-17 17:58:41
    比如10,他的单精度浮点数时41 20 00 00,先将其从16进制转换为10进制,就是65 32 00 00,再把他们对应的8位二进制数写出来01000001 00100000 00000000 00000000一共32位(32位是单精度,64位是双精度),再将其从右...
  • 由Python浮点数溢出问题到二进制

    千次阅读 2018-02-10 11:01:36
    为什么说浮点数缺乏精确性? python中浮点数运算问题 - 知乎 问题描述中很清楚,0.1+0.1+0.1-0.3没有得到结果0,而是溢出了(Python3.6中不会)。...它只能识别二进制,所以计算机中的数字用二进制表示。(数字...
  • #include #include ...如果该数字无法精确地32位以内的二进制表示,则打印"ERROR" 分析:其实就是浮点数二进制整数。十进制浮点数二进制的规则是:将数字N乘2取整,如果计算结果R为1就退出,否
  • 2.然后按32位浮点数表示二进制数据处理成十进制浮点数 3.左边第一个二进制是正负位,0正数,1负数 4.然后紧接着的八位是阶码、最后二十三位是尾数 5.假设阶码的二进制串是E,尾数的是M。转换的十进制的阶码是E10,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 757
精华内容 302
关键字:

二进制数用浮点数表示