zoukankan      html  css  js  c++  java
  • int,double与机器字长

    机器字长:计算机能直接处理的二进制数据的位数,它决定了计算机的运算精度

    想深入了解. 学好汇编语言对你帮助非常大.

    汇编语言中的,最基本的数据类型有: (1) byte (2)word (3)double word
    当然,还有qdword类型(8个字节)等。

    这些数据类型由机器架构决定。
    也就是说:1字节,2字节,4字节,8字节。每移一位就是2的倍数

    C语言的低级的高级语言,实现上是模拟汇编语言。

    char 必须对应 byte , 所以它的类型固定是1个字节。否则就没有相应的类型访问1个字节的数据。
    short 也必须对应于 word, 所以它的类型是2个字节。否则没有相应的类型访部2个字节的数据。

    至于int 类型:
    (1)x86架构的机器,基本都是32位。但是初始于实模式下,它是16位的。
    (2)16位下,它只能访问16位的地址空间。
    (3)所以,16位下,无论是int, long, long long(如果有的话) 都只能访问16位数据。即word
    (4)在32位保护模式下,可以一次访问32位地址空间。那么,int 对应于double word,long 和
    long long都只能一次访问32位数据。long long 模拟访问64位数据。实际上是只能访问32位数据。

    (5)当x86-64架构,被初始化于long mode中的64位模式下,long 相对应于64位数据。但也要看操作系统和编译器的支持度。
    机器字长:是指计算机进行一次整数运算所能处理的二进制数据的位数(整数运算即定点整数运算)。机器字长也就是运算器进行定点数运算的字长,通常也是CPU内部数据通路的宽度。现在一般为32位即4个字节,也有64位和16位的。

         算术类型的存储空间按照机器而定。一般,short类型为半个机器字长,int为一个机器字长,long为1或2个机器字长,float为一个机器字 长,double为两个字,long double用3或4个字长。C++标准规定的是每个算术类型的最小存储空间,但其并不阻止编译器用更大的存储空间。如果要保证移植性,尽量用 __int16 __int32 __int64吧,或者自己typedef int INT32一下。



    数据类型名称 字节数 别名 取值范围
    int * signed,signed int 操作系统决定,即与操作系统的"字长"有关
    unsigned int * unsigned 由操作系统决定,即与操作系统的"字长"有关
    __int8 1 char,signed char –128 到 127
    __int16 2 short,short int,signed short int –32,768 到 32,767
    __int32 4 signed,signed int –2,147,483,648 到 2,147,483,647
    __int64 8 –9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
    bool 1 false 或 true
    char 1 signed char –128 到 127
    unsigned char 1 0 到 255
    short 2 short int,signed short int –32,768 到 32,767
    unsigned short 2 unsigned short int 0 到 65,535
    long 4 long int,signed long int –2,147,483,648 到 2,147,483,647
    long long 8 none (but equivalent to __int64) –9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
    unsigned long 4 unsigned long int 0 到 4,294,967,295
    enum * 由操作系统决定,即与操作系统的"字长"有关
    float 4 3.4E +/- 38 (7 digits)
    double 8 1.7E +/- 308 (15 digits)
    long double 8 1.7E +/- 308 (15 digits)
    wchar_t 2 __wchar_t 0 到 65,535

    (P:指针的大小为定值4个字节)

    IA32
    char 1
    short 2
    int 4
    long 4
    long long 8
    float 4
    double 8
    long double 12
    pointer 4

    EMT64
    char 1
    short 2
    int 4
    long 8
    long long 8
    float 4
    double 8
    long double 16
    pointer 8
    EMT64本质上和AMD64一样都是IA-32的增强版本,Xeon借助于EM64T可实现高达1TB(40bit)的物理内存寻址和256TB(48bit)的虚拟内存寻址,并且良好地支持现有32位x86代码的执行,这一点跟AMD64无异,同时也是Intel开发EM64T的出发点—让现有的x86指令集能够执行64位代码,而继续保持对32位代码的良好兼容。但由于多方面的限制,无论是EM64T还是AMD64均只能实现比32位指令集更大内存空间的寻址,而无法真正做到纯64位指令集的1PB(50bit)和16EB(64bit)的物理内存和虚拟内存寻址(IA-64就能做到这一点),其关键在于EM64T和AMD64本质上仍是基于32位的x86指令集,只是Intel和AMD分别采用不同的技术手段对x86指令集进行扩展,从而实现对64位的支持
      在C++Primer第四版中介绍数据类型时,30页有一张表,里面包括了各种数据的字长,其中int的字长是16位,这一点一直困惑我。后来 发现上面的标题是“最小存储空间”。细心的同学可以看到31页有介绍,“一般short类型为半个及其子长,int类型为一个机器字长,而long为一个 或两个机器字长(在32为机器中int类型和龙类型通常字长是相同的)。”而我们通常用的机器都是32位的,所以int是4字节,long也是4字节。

    以下内容引自别人的博客http://hi.baidu.com/qinpc/blog/item/15c8ac64a10c10f5f736540a.html

    int类型比较特殊,具体的字节数同机器字长和编译器有关。如果要保证移植性,尽量用__int16 __int32 __int64吧,或者自己typedef int INT32一下。

    C、C++标准中只规定了某种类型的最小字节数(防止溢出)

    64位指的是cpu通用寄存器的数据宽度是64位的。找到一个图

    数据类型名称 字节数 别名 取值范围 int * signed,signed int 由操作系统决定,即与操作系统的"字长"有关 unsigned int * unsigned 由操作系统决定,即与操作系统的"字长"有关 __int8 1 char,signed char –128 到 127 __int16 2 short,short int,signed short int –32,768 到 32,767 __int32 4 signed,signed int –2,147,483,648 到 2,147,483,647 __int64 8 无 –9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 bool 1 无 false 或 true char 1 signed char –128 到 127 unsigned char 1 无 0 到 255 short 2 short int,signed short int –32,768 到 32,767 unsigned short 2 unsigned short int 0 到 65,535 long 4 long int,signed long int –2,147,483,648 到 2,147,483,647 long long 8 none (but equivalent to __int64) –9,223,372,036,854,775,808 到 9,223,372,036,854,775,807 unsigned long 4 unsigned long int 0 到 4,294,967,295 enum * 无 由操作系统决定,即与操作系统的"字长"有关 float 4 无 3.4E +/- 38 (7 digits) double 8 无 1.7E +/- 308 (15 digits) long double 8 无 1.7E +/- 308 (15 digits) wchar_t 2 __wchar_t 0 到 65,535

    类型标识符 类型说明 长度
    (字节) 范围 备注 char 字符型 1 -128 ~ 127 -27 ~ (27 -1) unsigned char 无符字符型 1 0 ~ 255 0 ~ (28 -1) short int 短整型 2 -32768 ~ 32767 2-15 ~ (215 - 1) unsigned short int 无符短整型 2 0 ~ 65535 0 ~ (216 - 1) int 整型 4 -2147483648 ~ 2147483647 -231 ~ (231 - 1) unsigned int 无符整型 4 0 ~ 4294967295 0 ~ (232-1) float 实型(单精度) 4 1.18*10-38 ~ 3.40*1038 7位有效位 double 实型(双精度) 8 2.23*10-308 ~ 1.79*10308 15位有效位 long double 实型(长双精度) 10 3.37*10-4932 ~ 1.18*104932 19位有效位
     C++中定义了一组表示整数、浮点数、单个字符和布尔值的算术类型(arithmetic type)。

      另外还定义了一种叫做void的特殊类型。void类型没有对应的值,仅用在有限的一些情况下,通常用作无返回值函数的返回类型。

      算术类型的存储空间依机器而定。这里的存储空间是指用来表示该类型的二进制位(bit)数。

      C++标准规定了每个算术类型的最小存储空间,但它并不阻止编译器使用更大的存储空间。

      事实上,对于int类型,几乎所有的编译器使用的存储空间都比所要求的大。

      因为位数不同,这些类型所能表示的最大(最小)值也因机器的不同而有所不同。
     
    C++算术类型的最小存储空间

      类型+含义+最小存储空间如下:

      bool 布尔型

      char 字符型 8位

      wchar_t 宽字符型 16位

      short 短整型 16位

      int 整形 16位

      long 长整形 32位

      float 单精度浮点型 6为有效数字

      double 双精度浮点型 10位有效数字

      long double 扩展精度浮点型 10位有效数字
     
    整形

      表示整数、字符和布尔值的算术类型合称为整形(integral type)。

      通常将8位的块作为一个字节,32位或4个字节作为一个字(word).

      一般的,short类型为半个机器字(word)长,int类型为一个机器字长,而long类型为一个或两个机器字长(在32位机器中int类型和long类型通常字长是相同的)。

      bool类型表示true和false。可以将算术类型的任何值赋给bool对象。

      0值算术类型代表false,其他任何非零的值都代表true。

    符号

      除bool类型外,整形可以是带符号的(signed)也可以是无符号的(unsigned)。

      无符号类型只能表示大于等于0的数,而带符号整形可以表示正数和负数。

      整形int,short和long都默认为带符号型。

      要获得无符号型则必须指定该类型为unsigned。比如unsigned long。

      unsigned int 可以简写为unsigned。
     
    浮点型

      类型float、double和long double分别表示单精度浮点数、双精度浮点数和扩展精度浮点数。

      一般float用一个字(32位)来表示,double类型用两个字(64位来表示),long double类型用三个或四个字(96或128位)来表示。

      float型只能保证6位有效数字,而double型至少可以保证10位有效数字。

  • 相关阅读:
    IntelliJ Idea的黑色主题+代码高亮
    @EqualsAndHashCode
    @NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor
    springcloud各种网址
    利用PowerDesigner连接Mysql数据库并逆向所有表关系图【两种方式】
    Java 异步实现的几种方式
    如何查看Linux操作系统版本
    Java中关于WeakReference和WeakHashMap的理解
    Java弱引用(WeakReference)的理解与使用
    Unchecked Exception 和 Checked Exception 比较
  • 原文地址:https://www.cnblogs.com/zhangyongjian/p/3633747.html
Copyright © 2011-2022 走看看