zoukankan      html  css  js  c++  java
  • 常用数据类型对应字节数,int长度

    常用数据类型对应字节数:

    这两台机器,前者32位,后者64位,测试了以下数据类型的长度:
    
    前者:
    int:4,long:4,long long:8
    后者:
    int:4,long:8,long long:8
    
    不是说int会变吗,为何变得是long?
    还有如果要写个通用的程序,订死必须用4个或8个字节的数据类型,在不需要重新编码编译的前提下,该如何处理这种变化?
    谢谢指教。。
    
    2楼 发表于 2008-4-15 09:35 
    QUOTE:
    原帖由 maxxfire 于 2008-4-15 09:28 发表 
    这两台机器,前者32位,后者64位,测试了以下数据类型的长度:
    
    前者:
    int:4,long:4,long long:8
    后者:
    int:4,long:8,long long:8
    
    不是说int会变吗,为何变得是long?
    还有如果要写个通用的程序,订 ...
    
    回答:   在16bit系统中sizeof(int)=2;
    在有的64bit系统中的确有sizeof(int)=8的情况,跟机器字长和编译器都有关.
    
    要写个通用的程序,订死必须用4个或8个字节的数据类型,在不需要重新编码编译的前提下,该如何处理这种变化?"
    
    用long long 吧,相对好一些,但其它代码不需要重新编译是比较困难的!
    
    使用int32_t,int64_t,int16_t等类型,在头文件<stdint.h>中定义的
    
    =================================
    两台机器,前者32位,后者64位,测试了以下数据类型的长度:
    
    前者:
    int:4,long:4,long long:8
    后者:
    int:4,long:8,long long:8
    不是说int会变吗,为何变得是long?
    
    
    The common programming model for existing 32-bit Unix stystems is caled the ILP32 model,denoting that integers, long integers and pointers occupy 32 bits. The model that is becoming most prevalent for 64-bit Unix systems is called LP64 model, meaming only long integers and pointers require 64 bits.
    
    
    至于还有如果要写个通用的程序,订死必须用4个或8个字节的数据类型,在不需要重新编码编译的前提下,该如何处理这种变化?
    赞同楼上的观点
    不过楼主要求不重新编译是不行的吧

    Iso/ansi本身并不规定内部数据类型的长度(原因简单,如果他们这样做了,现存的大部分代码都不可用了, 所以标准委员会把定义数据类型的任务交给编译器的研发者) 数据类型的长度的是由编译器和CPU共同决定的, 最近调试一个程序,吃了数据长度的亏。数据长度对程序的移植性至关重要。这里对C的基本数据类型长度以及与编译器和CPU的关系做个总结。

    一 数据长度的陷阱

    Char, short,int,long这些数据类型的长度在不同的机器上不同的,不仅是数据长度,不同的编译器对这些数据类型的符号定义也是不同的。比如,在有些编译器,char默认是有符号的,有些编译器把char当成是无符号的。在嵌入式软件中,可移植性异常重要,所以MISRA(汽车工业软件可靠性联合会)就建议使用这些数据类型时,前面一定要有signed或unsigned 修饰,明确说明该数据类型的符号.

    用代码举个例子

    char ch;

    ch = 0xff;

    if(ch == 0xff)……

    学过C的人都应该知道C 的隐式类型转换规则,运算的两个数据类型如果不同,低级的往高级的转换。在本例中,ch 是 char 类型,是低级的,0xff是整型,高级. 在if语句中,ch要转化为整型的。转换的动作就是填充符号位,如果是无符号数就填充0. 所以本例中,如果ch 为无符号数,扩展后ch = 0x00ff(假设整型是16位), if语句成立. 但是如果ch 是有符号的,扩展后 ch = 0xffff, if 语句是不会成立的. 另外要注意逻辑操作符以及左移,右移操作符不支持这种隐式类型转换规则.

    现在假设我们认为char 是8位(大部分机器上它都是这样的), 那么signed char 的范围应该是-127~127, unsigned char 的范围应该是0~255. ANSI/ISO 是这样写的。写到这里,可能就有人会有疑问了,因为我们可能看到有些书上写有符号的char 的范围是-128~127. 这是说它的补码表示. 其实ANSI/ISO并未规定有符号数用补码表示,所以在如果查一下ANSI/ISO标准会发现它确实有符号的char 是-127~127. 但是现实情况是几乎所有的机器都是用补码来表示有符号数, 正数的补码是它本身,整负数的补码是除符号位外各位取反加1, 最小的负数(signed char)的在计算机里表示为0x80, 把它取补得到它的原码就是-128.

    二 常用编译器支持的数据类型

    C内部的基本数据类型是没有可移植性而言的,不同的机器上,不同的编译器数据长度的大小是不一样的。ISO建议程序员在编写要移植的代码时,不要直接用基本的数据类型,而是用typedef 去重新定义。这样在移植程序的时候只要改动小部分代码就可以了。但是typedef的前提是你对编译环境所支持的数据类型有清楚的认识。去网上找了一下, 还没有一个对目前主流编译器支持的数据类型长度的总结,于是就查了一些资料,这里做一个总结(当然不是全部了,只是列举了我用过的)

              类型

        编译器

    字节

     

    Unsigned/signed char     

    visual studio

    1

    ads

    1

    avr studio(gcc)

    1

    Keil c

    1

    Turbo c

    1

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

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

     

     

    Unsigned/signed short

    visual studio

    2

    ads

    2

    avr studio(gcc)

    2

    Keil c

    2

    Turbo c

    2

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

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

     

     

    Unsigned/signed int

    visual studio

    4

    ads

    4

    avr studio(gcc)

    2

    Keil c

    2

    Turbo c

    2

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

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

     

     

    Unsigned/signed long

    visual studio

    8

    ads

    4

    avr studio(gcc)

    4

    Keil c

    4

    Turbo c

    4

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

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

     

     

    Long long

    visual studio

    8

    ads

    4

    avr studio(gcc)

    8

    Keil c

    8

    Turbo c

    4

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

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

     

     

    double

    visual studio

    8

    ads

    4

    avr studio(gcc)

       4

    Keil c

    4

    Turbo c

    8

    一、程序运行平台
           不同的平台上对不同数据类型分配的字节数是不同的。
           个人对平台的理解是CPU+OS+Compiler,是因为: 
           1、64位机器也可以装32位系统(x64装XP); 
           2、32位机器上可以有16/32位的编译器(XP上有tc是16位的,其他常见的是32位的); 
           3、即使是32位的编译器也可以弄出64位的integer来(int64)。 
           以上这些是基于常见的wintel平台,加上我们可能很少机会接触的其它平台(其它的CPU和OS),所以个人认为所谓平台的概念是三者的组合。 
           虽然三者的长度可以不一样,但显然相互配合(即长度相等,32位的CPU+32位的OS+32位的Compiler)发挥的能量最大。 
           理论上来讲 我觉得数据类型的字节数应该是由CPU决定的,但是实际上主要由编译器决定(占多少位由编译器在编译期间说了算)。
    
    二、常用数据类型对应字节数
           可用如sizeof(char),sizeof(char*)等得出
           32位编译器:
    
           char :1个字节
           char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
           short int : 2个字节
           int: 4个字节
           unsigned int : 4个字节
           float: 4个字节
           double: 8个字节
           long: 4个字节
           long long: 8个字节
           unsigned long: 4个字节
    
           64位编译器:
    
           char :1个字节
           char*(即指针变量): 8个字节
           short int : 2个字节
           int: 4个字节
           unsigned int : 4个字节
           float: 4个字节
           double: 8个字节
           long: 8个字节
           long long: 8个字节
           unsigned long: 8个字节
  • 相关阅读:
    dagScheduler
    elasticsearch映射
    elasticsearch数据结构
    spring boot 整合 elasticsearch 5.x
    spark快速开发之scala基础之5高阶函数,偏函数,闭包
    Halcon学习笔记2
    HALCON算子1
    Halcon学习笔记1
    ML-学习提纲2
    ML-学习提纲1
  • 原文地址:https://www.cnblogs.com/timssd/p/4078398.html
Copyright © 2011-2022 走看看