不同系统下的几个基本类型的字节大小

呀呀的呀 2014-01-14 11:48:12
请问:
在dos 16位系统 和 win、linux的16位、32位、64位系统下,(short、int、long、longlong、指针)分别占用多少个字节呢?
...全文
275 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
呀呀的呀 2014-02-22
  • 打赏
  • 举报
回复
感谢大家的回答,结贴给分
赵4老师 2014-01-16
  • 打赏
  • 举报
回复
看一下include\limits.h的内容。
lm_whales 2014-01-16
  • 打赏
  • 举报
回复
引用 14 楼 YTerrenceLau 的回复:
short、int、long、longlong、指针 Win32和linux 32均采用ILP32数据模型,即int(I) long(L) pointer(P)均为32bits。 longlong基本都是64bits。short都是16bits。 Win64采用LLP64模型,即longlong(LL) 和 pointer(P)为64bits。 short仍未16bits,int long扔为32bits。 Linux64采用LP64数据模型,即long(L) pointer(P)为64bits。 longlong 仍未64bits,short仍未16bits,int仍未32bits。
++ 这个说到点子上了 似乎在那本书上看过,不过印象不深,被忽略了。
YTerrenceLau 2014-01-15
  • 打赏
  • 举报
回复
核心是“数据模型”,可以参阅:http://blog.csdn.net/zhangzhenghe/article/details/6766581
YTerrenceLau 2014-01-15
  • 打赏
  • 举报
回复
short、int、long、longlong、指针 Win32和linux 32均采用ILP32数据模型,即int(I) long(L) pointer(P)均为32bits。 longlong基本都是64bits。short都是16bits。 Win64采用LLP64模型,即longlong(LL) 和 pointer(P)为64bits。 short仍未16bits,int long扔为32bits。 Linux64采用LP64数据模型,即long(L) pointer(P)为64bits。 longlong 仍未64bits,short仍未16bits,int仍未32bits。
赵4老师 2014-01-15
  • 打赏
  • 举报
回复
不要迷信书、考题、老师、回帖; 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实! 有人说一套做一套,你相信他说的还是相信他做的? 其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗? 不要写连自己也预测不了结果的代码!
呀呀的呀 2014-01-14
  • 打赏
  • 举报
回复
引用 1 楼 lx458004975 的回复:
sizeof一下不就出来了
如何模拟成不同位数系统sizeof?
偏爱风流 2014-01-14
  • 打赏
  • 举报
回复
sizeof一下不就出来了
lm_whales 2014-01-14
  • 打赏
  • 举报
回复
32Bits gcc: long double, 是12Bytes, 应该是 10 Bytes 有效字节, 另外补充2Bytes 0,估计为了对齐。 我用 +1,-1 试验了一下, 结论是 高 4字节中的低2字节,的最高位,是符号位。 16,32Bits long double, BCB 10 Bytes long double, VS 8 Bytes 不知道64Bits的 浮点寄存器堆栈,长度改变了没,改变了, 估计就有 128 Bits (16字节) 浮点数了; 好像MS已经有128Bits整数了,似乎也有128Bits浮点数, 只是我一直在用32Bits 操作系统 不清楚64Bits 对应的类型是什么样子的。
vipcxj 2014-01-14
  • 打赏
  • 举报
回复
引用 10 楼 vipcxj 的回复:
我只说主流编译器 char 1 short 2 int 4 float 4 double 8 long long 8 unsigned版本一样,还有二个特殊的long和long double long的长度在32位下是4,64位下是64 long double/double long 这俩貌似是同一个东西, 我记得在32位时long double在vs下是8位,在gcc下听说是12位,64位下,vs没试过,gcc下貌似变16位 以上我说的主要指vs和gcc两款主流编译器,其他用得少的不知道,那些老掉牙的知道了也木有意义
笔误,那些12位,16位,指的是字节
vipcxj 2014-01-14
  • 打赏
  • 举报
回复
我只说主流编译器 char 1 short 2 int 4 float 4 double 8 long long 8 unsigned版本一样,还有二个特殊的long和long double long的长度在32位下是4,64位下是64 long double/double long 这俩貌似是同一个东西, 我记得在32位时long double在vs下是8位,在gcc下听说是12位,64位下,vs没试过,gcc下貌似变16位 以上我说的主要指vs和gcc两款主流编译器,其他用得少的不知道,那些老掉牙的知道了也木有意义
呀呀的呀 2014-01-14
  • 打赏
  • 举报
回复
引用 7 楼 lm_whales 的回复:
long long 类型出台太晚了, 当时未获得那些编译器的支持,所以未能实现。 VC6,BCB6都是自己实现的类型 __int64, Win32 Api 自己也有LONGLONG 现在,新版编译器如 VC9,VC10。。。等都有 long long (int) 类型 64 Bits 64 Bits Windows 和所有linux (32,64)都没用过,不清楚类型系统是如何设计的。
感谢
lm_whales 2014-01-14
  • 打赏
  • 举报
回复
DOS 16 Bits 不同模式下,未明确表明属性的 (near,far,TC: huge) 的 指针类型,是不同。 其中tiny ,small 同模式下 near
lm_whales 2014-01-14
  • 打赏
  • 举报
回复
long long 类型出台太晚了, 当时未获得那些编译器的支持,所以未能实现。 VC6,BCB6都是自己实现的类型 __int64, Win32 Api 自己也有LONGLONG 现在,新版编译器如 VC9,VC10。。。等都有 long long (int) 类型 64 Bits 64 Bits Windows 和所有linux (32,64)都没用过,不清楚类型系统是如何设计的。
呀呀的呀 2014-01-14
  • 打赏
  • 举报
回复
引用 4 楼 lm_whales 的回复:
dos 16 win16 win32 win64 short 16 16 16 不清楚,自己测试吧 int 16 16 32 不清楚,自己测试吧 long 32 32 32 不清楚,自己测试吧 long long 未实现 未实现 VC6,BCB 替代品(早期版) 不清楚,自己测试吧 VC6,BCB:__int64 :64 API: LONGLONG :64 还有一个LARGE_INTEGER :64 VC9,VC10已实现 long long :64 指针: void near *: 16 16 32 (void* = void near*) void far *: 32 32 不给用,未定义(48Bits far*) TC:huge * 32
哥们未实现是说没有这个类型吗?我记得linux下64位的long是64位的(XP是32位),除了这个linux和win其他类型还有差别吗
呀呀的呀 2014-01-14
  • 打赏
  • 举报
回复
引用 3 楼 turingo 的回复:
用类似于下面的方法: typedef unsigned int int32u_t; ... typedef unsigned long int32u_t; [quote=引用 2 楼 youxi3505 的回复:] [quote=引用 1 楼 lx458004975 的回复:] sizeof一下不就出来了
如何模拟成不同位数系统sizeof?[/quote][/quote] 没看懂啥意思,这样写跟模拟成不捅系统有什么关系呢?我只有一个“win7系统 + vs2005”
lm_whales 2014-01-14
  • 打赏
  • 举报
回复
dos 16 win16 win32 win64 short 16 16 16 不清楚,自己测试吧 int 16 16 32 不清楚,自己测试吧 long 32 32 32 不清楚,自己测试吧 long long 未实现 未实现 VC6,BCB 替代品(早期版) 不清楚,自己测试吧 VC6,BCB:__int64 :64 API: LONGLONG :64 还有一个LARGE_INTEGER :64 VC9,VC10已实现 long long :64 指针: void near *: 16 16 32 (void* = void near*) void far *: 32 32 不给用,未定义(48Bits far*) TC:huge * 32
图灵狗 2014-01-14
  • 打赏
  • 举报
回复
用类似于下面的方法: typedef unsigned int int32u_t; ... typedef unsigned long int32u_t;
引用 2 楼 youxi3505 的回复:
[quote=引用 1 楼 lx458004975 的回复:] sizeof一下不就出来了
如何模拟成不同位数系统sizeof?[/quote]

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧