gpt4 book ai didi

c - 在 C 中定义类似 int 的类型

转载 作者:行者123 更新时间:2023-11-30 17:23:08 26 4
gpt4 key购买 nike

我想在 C 中定义一个新类型,它应该从以下位置获取值:

  1. 0 到 16
  2. -8 到 +8(另一个程序)

此外,它应该只占用 5 位内存。 (最小尺寸)

最佳答案

原始问题从 5 位更改为 4 位,但范围 0..16 确实需要 5 位,正如一些人评论的那样。

您不能使用小于char的存储类型。您的问题来自算术和位操作(例如移位),因为您必须屏蔽不属于您的类型的位,并且这必须通过(内联)函数或宏来完成。

但是,有符号 5 位类型会带来一个更大的问题。如果没有符号扩展到高位,您将无法执行乘法和其他运算。如果结果为负,则必须截断这些位,因为它们位于 5 位字段之外。另一方面,如果您截断它们,则您使用的是 8 位字段,而不是 5 位字段。

最重要的是,如果不先对它们进行符号扩展,您将无法打印任何带符号的值或将它们转换为 charint。所以你毕竟不会真正使用 5 位类型。

#include <stdio.h>

#define MASK5 0x1F
#define MASKX 0xF0

typedef unsigned char u5; // unsigned 5-bit type
typedef char s5; // signed 5-bit type

char extend5 (char num) {
if (num & MASKX)
num |= MASKX;
return num;
}

s5 mul_s5 (s5 arg1, s5 arg2) {
return (s5)((extend5(arg1) * extend5(arg2)) & MASK5);
}

u5 mul_u5 (u5 arg1, u5 arg2) {
return (arg1 * arg2) & MASK5;
}

int main(void)
{
// simple example
printf ("%2u * %2u = %2u\n", 2, 3, (unsigned)mul_u5((u5)2, (u5)3));

// overflow example is truncated
printf ("%2u * %2u = %2u\n",12,23, (unsigned)mul_u5((u5)12, (u5)23));

// signed example without extending product
printf ("%2d * %2d = %2d\n",-2, 3, (int)mul_s5((s5)-2, (s5)3));

// signed example with sign extension
printf ("%2d * %2d = %2d\n",-2, 3, (int)extend5(mul_s5((s5)-2, (s5)3)));

return 0;
}

程序输出

 2 *  3 =  6
12 * 23 = 20
-2 * 3 = 26
-2 * 3 = -6

关于c - 在 C 中定义类似 int 的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27704179/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com