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

这两台机器,前者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. js获取iframe的id

    有一个需求是在iframe页面调用父页面一个方法,开始我用window.parent.length来判断页面有几个层,但是不好用,因为我的浏览器安装了一个插件,这个插件会动态向页面插入一个iframe ...

  2. python之web框架(2):了解WSGI接口

    python之web框架(2):了解WSGI接口 1.什么是wsgi接口: wsgi:Web Service Gateway Interface.它不是模块,而只是一种规范,方便web服务器和各种框架 ...

  3. thinkphp3.2局部不缓存的静态缓存

    在thinkphp中,对于访问量大的网站可以用静态缓存来越过数据库瓶颈来提高访问速度,但有时候并不是整个页面都要缓存的,如登录的用户名部分,那么如何实现局部不缓存呢? 其实有多种方法,但对于Think ...

  4. js获取单个查询串的值

    function getSearchString(key) { // 获取URL中?之后的字符 var searchArr= window.location.href.split('#')[0].sp ...

  5. 学习 HMM

    简介 HMM 中的变量可以分为两组. 第一组是状态变量 \(\{y_i,y_2,\cdots, y_n\}\), 其中 \(y_i \in \mathcal{Y}\) 表示第 \(i\) 时刻的系统状 ...

  6. CSUOJ 1162 Balls in the Boxes 快速幂

    Description Mr. Mindless has many balls and many boxes,he wants to put all the balls into some of th ...

  7. CodeForces 140C New Year Snowmen(堆)

    题面 CodeForces 题解 因为要保证两两不同,所以不能单纯的开堆来维护,堆维护一个二元组,个数为第一关键字,编号为第二关键字,对于一个相同的颜色,统计一下这个颜色的个数再用堆来维护就好了. # ...

  8. bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp

    给定\(n\)个点,\(m\)条边的带权无向图 选出一些边,使得\(4\)对点之间可达,询问权值最小为多少 \(n \leqslant 30, m \leqslant 1000\) 首先看数据范围,\ ...

  9. 洛谷 P4884 多少个1?

    题面在这里 好久没做题了2333,竟然还一次A了,神奇 大概就是等比数列然后把分母乘过去,然后直接BSGS就行了,就是要写快速乘恩... #include<bits/stdc++.h> # ...

  10. Curl 及 Curl的使用介绍

    Curl 简介 Curl是Linux下一个很强大的http命令行工具,其功能十分强大. 1) 二话不说,先从这里开始吧! $ curl http://www.linuxidc.com 回车之后,www ...