C语言里,关于数据类型的大小问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言里,关于数据类型的大小问题相关的知识,希望对你有一定的参考价值。
如果我们定义int类型为2个字节(默认8位),
那么在8位机器上,int 所拥有的位数就是 2 * 8,
在16位机器上,int 所拥有的位数就是 2 * 16,表达的范围更大。
依次类推。
我的理解对吗?
如果编译器指定int为16位,那么它就是16位,指定int为32位,就是32位。并不是我们定义int为2个字节的,这个是编译器决定的。
在一般情况下,int默认都是32位,因为现在以32位编译器为主。在老的编译器上,int都是16位的。 参考技术A 8位、16位、32位。数字后的“位”,指的是“位元 (Bits)”,位元,简单来讲就是有多少位数的二进制码。
单纯看多少 Bytes 多少 Bits 的计算,是这样的概念:
2个字节(就是2个位元组 - 2 Bytes)
1 Bytes = 8 Bits
2 Bytes = 16 Bits
8 Bits 的二进制表示法:XXXX-XXXX
8 Bits “所拥有的位数”,以二进制来看就是固定 8 个。
8 Bits “能表达的最大数”,即所有 Bit 皆为 1,所以应该是 255。(你的 2 * 8 是怎么来的?)
16 Bits 也是同样道理。
16 Bits 的二进制表示法:XXXX-XXXX-XXXX-XXXX
16 Bits "所拥有的位数",以二进制来看就是固定 16 个。
16 Bits“能表达的最大数”,即所有 Bit 皆为 1,所以应该是 65535。(你的 2 * 16 是怎么来的?)
至于你说“在 X 位机器上的 int“,这其实是不怎么精确,也容易让人摸不着头绪的说法,因为
1、机器多少位元,通俗一点讲这是硬件的规格,专业一点讲就是处理器能影响到的最大内存容量。
2、但是关于 int 具体范围的定义,每种程式语言都会有一些差异。有些是 4 bits,有些 8 bits 或 16 bits。
两者完全不是一回事,请勿混为一谈。 参考技术B 不是的,还是2*8.
既然要求就是2个8,那永远都是要求2个8. 参考技术C 这个东西在你编译完了以后就定下来了的,不会因为在不同的机器上运行尺寸就不一样
关于C语言的语法中类型转换的一个问题。求教C语言高手。
在Lua语言的源代码中有如下宏定义:
#define UNUSED(x) ((void)(x)) /* to avoid warnings */
有如下用法:
static void f_luaopen (lua_State *L, void *ud) global_State *g = G(L);// get global_State ptr saved in lua_State UNUSED(ud);// 这一句看不懂,求指导~ stack_init(L, L); /* init stack */ sethvalue(L, gt(L), luaH_new(L, 0, 2)); /* table of globals */ sethvalue(L, registry(L), luaH_new(L, 0, 2)); /* registry */ luaS_resize(L, MINSTRTABSIZE); /* initial size of string table */ luaT_init(L); luaX_init(L); luaS_fix(luaS_newliteral(L, MEMERRMSG)); g->GCthreshold = 4*g->totalbytes;
我不知道上面函数中第二句的作用。求指教!谢谢!
就像#define PI 3.14一样
所以那句在编译的时候按照((void)(ud))编译追问
谢谢您的回答!
我能理解您的意思。但是单独的一行转换
((void)ud);
有什么意义呢?
下面是源代码:
你注释说的很清楚了 避免警告 如果ud只定义不使用 编译时就会有警告 单独这一句就是为了使用它 避免警告 你可以把这句注释掉再编译试试 比较不同
追问学习了!谢谢您!
本回答被提问者采纳以上是关于C语言里,关于数据类型的大小问题的主要内容,如果未能解决你的问题,请参考以下文章