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

这两台机器,前者32位,后者64位,测试了以下数据类型的长度:

前者:
,,
后者:
,,

不是说int会变吗,为何变得是long?
还有如果要写个通用的程序,订死必须用4个或8个字节的数据类型,在不需要重新编码编译的前提下,该如何处理这种变化?
谢谢指教。。

2楼 发表于 -- :
QUOTE:
原帖由 maxxfire 于 -- : 发表
这两台机器,前者32位,后者64位,测试了以下数据类型的长度:

前者:
,,
后者:
,,

不是说int会变吗,为何变得是long?
还有如果要写个通用的程序,订 ...

回答:   在16bit系统中sizeof(;
在有的64bit系统中的确有sizeof(int)=8的情况,跟机器字长和编译器都有关.

要写个通用的程序,订死必须用4个或8个字节的数据类型,在不需要重新编码编译的前提下,该如何处理这种变化?"

用long long 吧,相对好一些,但其它代码不需要重新编译是比较困难的!

使用int32_t,int64_t,int16_t等类型,在头文件<stdint.h>中定义的

=================================
两台机器,前者32位,后者64位,测试了以下数据类型的长度:

前者:
,,
后者:
,,
不是说int会变吗,为何变得是long?

The common programming model -bit Unix stystems  bits. The model that -bit Unix systems  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,是因为:
       、64位机器也可以装32位系统(x64装XP);
       、32位机器上可以有16/32位的编译器(XP上有tc是16位的,其他常见的是32位的);
       、即使是32位的编译器也可以弄出64位的integer来(int64)。
       以上这些是基于常见的wintel平台,加上我们可能很少机会接触的其它平台(其它的CPU和OS),所以个人认为所谓平台的概念是三者的组合。
       虽然三者的长度可以不一样,但显然相互配合(即长度相等,32位的CPU+32位的OS+32位的Compiler)发挥的能量最大。
       理论上来讲 我觉得数据类型的字节数应该是由CPU决定的,但是实际上主要由编译器决定(占多少位由编译器在编译期间说了算)。

二、常用数据类型对应字节数
       可用如sizeof(char),sizeof(char*)等得出
       32位编译器:

       char :1个字节
       , 即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个字节

常用数据类型对应字节数,int长度的更多相关文章

  1. Mysql 常用数据类型 占用字节数 [转]

    数据类型是定义列中可以存储什么数据以及该数据实际怎么存储的基本规则.Mysql的常用数据类型主要有: 串数据类型:最常用的数据类型,有两种基本的串类型:分别为定长串和不定长串.定长串结束长度固定的字符 ...

  2. 数据类型对应字节数(32位,64位 int 占字节数)

    数据类型对应字节数(32位,64位 int 占字节数) 可用如sizeof(char),sizeof(char*)等得出 32位编译器: char :1个字节 char*(即指针变量): 4个字节(3 ...

  3. C语言在32位和64位机器下数字数据类型的字节数取决于编译器和平台, 主要由编译器决定。

    C语言中数字数据类型的字节数 C声明 32位机器 64位机器 char 1 1 short int 2 2 int   4 4 //整型在32位和64位下都是4个字节 long int   4 8 l ...

  4. Mac OS X和iOS上基本数据类型的字节数

    在Mac和IPhone上分别运行下面的程序: NSLog(@"char size = %lu", sizeof(char)); NSLog(@"short int siz ...

  5. Java字符串中常用字符占用字节数

    java中一个char型的数据(也就是一个字符)占两个字节.而Java中常用的字符包括数字.英文字母.英文符号.中文汉字.中文符号等,若在字符串中包含里面的多种字符,它们是否都占两个字符呢?答案是否定 ...

  6. java中各种数据类型占用字节数

    1字节(Byte)=8bit java的基本类型 类型 所占字节 byte 1 short 2 int 4 long 8 float 4 double 8 char 2 String中字母和汉字所占字 ...

  7. C++基本数据类型占字节数

    32位编译器 char :1个字节char*(即指针变量): 4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节.同理64位编译器)short int : 2个字节int:  4个 ...

  8. c语言中,常见数据类型的字节数

    一直记不住这个,特意mark下来 和机器字长及编译器有关系: 所以,int,long int,short int的宽度都可能随编译器而异.但有几条铁定的原则(ANSI/ISO制订的):  1 size ...

  9. C语言中数据类型的字节数

    类型 16位 32 位 64位 char 1 1 1 short int 2 2 2 int 2 4 4 unsigned int 2 4 4 float 4 4 4 double 8 8 8 lon ...

随机推荐

  1. Ionic Js二十:选项卡栏操作

    ion-tabs ion-tabs 是有一组页面选项卡组成的选项卡栏.可以通过点击选项来切换页面. 对于 iOS,它会出现在屏幕的底部,Android会出现在屏幕的顶部(导航栏下面). 用法 < ...

  2. 洛谷P2597 [ZJOI2012] 灾难 [拓扑排序,LCA]

    题目传送门 灾难 题目描述 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. ...

  3. [代码审计]某开源商城前台getshell

    0x00 前言 这套系统搞了有点久了,漏洞是发现了,但一直卡在某个地方迟迟没拿下来. 下面就分享一下自己审这套系统的整个过程. 0x01 系统简介 略   0x02 审计入口 看到inc\functi ...

  4. BigDecimal 两种方式

    第一种: Double a=0.06; Double b=0.01; BigDecimal addend = BigDecimal.valueOf(a); BigDecimal augend = Bi ...

  5. Android 使用ViewPager 做的半吊子的图片轮播

    Android 使用ViewPager 做的半吊子的图片轮播 效果图 虽然不咋样,但是最起码的功能是实现了,下面我们来一步步的实现它. 界面 下面我们来分析一下界面的构成 整体的布局: 因为我们要做出 ...

  6. luoguP3871 [TJOI2010]中位数

    题目链接 luoguP3871 [TJOI2010]中位数 题解 平衡树 代码 #include<vector> #include<cstdio> #include<cs ...

  7. LOJ P1155 双栈排序 二分图染色 图论

    https://www.luogu.org/problem/show?pid=P1155 题解: https://www.byvoid.com/zhs/blog/noip2008-twostack 开 ...

  8. 火狐FoxyProxy配置教程

    原文:http://www.lvtao.net/tool/640.html 虽然autoproxy是火狐上最优秀的代理插件,但是好久不更新,也有一些bug,比如观看youtube视频7分钟左右会无法播 ...

  9. libuuid.so: cannot open shared object file: No such file or directory

    在玩ngx-lua时候有个 resty-uuid 需要引用 libuuid.so 动态库 打印log提示信息是这样的: libuuid.so: cannot open shared object fi ...

  10. spring---aop(4)---Spring AOP的CGLIB动态代理

    写在前面 前面介绍了Spring AOP的JDK动态代理的过程,这一篇文章就要介绍下Spring AOP的Cglib代理过程. CGLib全称为Code Generation Library,是一个强 ...