在C语言编程时,有时我的函数会接收数值,这些数值总是在0到4的范围内.32位int
最多可以保存2,147,483,647
。这是我没有使用的大量分配内存。我知道的最低范围类型是char
(从0
到255
,对吗?)。使用它来保存低范围数值是一个好习惯吗?还有其他类型我可以使用吗?
答案 0 :(得分:4)
如果它是一个标量函数参数,它在传递给函数时肯定会在实践中被提升为至少32位类型,因此使用char
将没有实际的区别。我认为为了提高可读性会更好,int
是显而易见的"一般整数值"类型。
但是,如果您可能拥有大量值的数组,则使用char
将使值能够更紧密地打包在内存中。如果你真的按下了内存,你可以通过每个值只使用3或4位来更紧凑地打包它们(最少3个,4个更好地对齐)。然而,处理效率肯定会降低。
答案 1 :(得分:4)
如果确实需要节省空间,则可以使用位域。但请注意,您可能需要更多周期才能访问数据。 (即使访问现代硬件上的字符可能需要比本机整数大小更多的周期)
(编辑以举例:
struct packed_values
{
unsigned int val1 : 3; /* ranges from 0-7 */
unsigned int val2 : 3;
unsigned int val3 : 3;
unsigned int val4 : 3;
unsigned int val5 : 3;
unsigned int val6 : 3;
unsigned int val7 : 3;
unsigned int val8 : 3;
unsigned int val9 : 3;
unsigned int val10 : 3;
unsigned int padding : 2; // make this be 32bits
};
packed_value myval;
myval.val1 = 5;
myval.val2 = 6;
myval.val3 = 7;
)
答案 2 :(得分:3)
不要将char
用于此“效率” - 这只会让人感到困惑/烦恼(比如我:-)。使用int
表示一般数字整数。
为了精确控制,例如对于8位RGB像素的数组,请使用uint8_t
。
答案 3 :(得分:2)
用于传递值的类型几乎无关紧要,你应该使用字节对齐的类型,char
对此很好(尽管在几乎任何数值运算后它都可能会被转换为int ,所以int可能更容易)。
将数据存储在数组中时,应考虑将数据打包为每个值2位。
答案 4 :(得分:1)
char非常适合保持低范围值。它提供了效率,尤其是当您拥有大量值时。没有什么比这更小,因为char是一个完整的字节,除非你决定通过分区来将多个值存储在一个变量中...祝你好运!
答案 5 :(得分:1)
char
是一个窄整数类型。它可以是签名的也可以是未签名的。如果它是无符号的,则其范围至少为0到255;如果签名,其范围至少为-127至+127。 (是的,-127,不是-128;标准对于有符号整数不需要2&#s;补码)。
类型char
,顾名思义,主要用于保存字符 - 但如果您愿意,可以使用它来保存小整数,特别是如果您知道它们只在范围内0到127.使用unsigned char
或signed char
可能更好。
但无论如何,相对于使用int
,不要期望节省的空间是显着的。许多系统需要更多和更慢的代码才能对char
值执行算术而不是int
值 - 并且在大多数情况下,char
值会隐式提升为int
。如果需要存储大量的小整数值,则某些字符类型的数组是有意义的。对于单个变量,使用char
而不是int
不会节省太多,如果有的话。
您还应该记住,int
仅保证至少为16位,而不是32位。(但是现在,在大多数系统上,它可能会是32位或更宽) #39;可能会使用,除非您正在进行嵌入式工作。)如果您需要特定的大小,<stdint.h>
中定义了许多类型(实际上是typedef,现有类型的别名)。 / p>
答案 6 :(得分:1)
没有关于性能的C规范,因此任何答案都充其量只是一个指导原则并且需要进行性能分析。
在一般
中 1)使用int
(或unsigned
)是最佳速度和最小代码大小。
2)使用最小整数类型char
,signed char
或unsigned char
),因为它们使用的内存空间最小。除了_Bool
之外,没有任何单一类型更小,这对于0到4不起作用。如果您有许多这样的小对象要打包在一起,则位字段可能会更小。
当有大量数组许多复制或内存亲爱时,最好使用小整数类型/位字段。其他简单的代码应该占上风。
许多人都提到char
假设:
1)签名或未签名。
2)最小宽度为8位,最小范围为0到255 或 -127到127.(不是-128)