C语言里,关于数据类型的大小问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言里,关于数据类型的大小问题相关的知识,希望对你有一定的参考价值。

如果我们定义int类型为2个字节(默认8位),
那么在8位机器上,int 所拥有的位数就是 2 * 8,
在16位机器上,int 所拥有的位数就是 2 * 16,表达的范围更大。
依次类推。
我的理解对吗?

不对哦,小兄弟。 int是基本整数类型,它的大小只和编译器有关系,和机器无关。
如果编译器指定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;
我不知道上面函数中第二句的作用。求指教!谢谢!

参考技术A 有误吧?UNUSED的宏定义是变量类型,而代码中UNUSED(ud)的ud是指针啊!如果宏定义是#define UNUSED(x) ((void *)(x))的话就正确了。 参考技术B #define UNUSED(x) ((void)(x)) 这是宏定义 在编译的时候 把UNUSED(x)替换为((void)(x))编译
就像#define PI 3.14一样
所以那句在编译的时候按照((void)(ud))编译追问

谢谢您的回答!

我能理解您的意思。但是单独的一行转换

((void)ud);

有什么意义呢?

下面是源代码:

追答

你注释说的很清楚了 避免警告 如果ud只定义不使用 编译时就会有警告 单独这一句就是为了使用它 避免警告 你可以把这句注释掉再编译试试 比较不同

追问

学习了!谢谢您!

本回答被提问者采纳

以上是关于C语言里,关于数据类型的大小问题的主要内容,如果未能解决你的问题,请参考以下文章

c语言,如何将多种类型数据组成一个字符串

C语言中各种数据类型有啥区别?

C语言关于数据类型范围的问题,请牛人解答

关于C语言数据类型转换的一个小问题,很简单哦!!

C语言篇 - 数据在内存中的存储

C 语言数据类型本质 ( sizeof 函数 | 数据类型大小 )