相关疑难解决方法(0)

我是否施放了malloc的结果?

这个问题,有人建议意见,我应该不会投的结果malloc,即

int *sieve = malloc(sizeof(int) * length);
Run Code Online (Sandbox Code Playgroud)

而不是:

int *sieve = (int *) malloc(sizeof(int) * length);
Run Code Online (Sandbox Code Playgroud)

为什么会这样呢?

c malloc casting

2318
推荐指数
27
解决办法
22万
查看次数

如何以C标准方式进行位表示?

根据C标准,整数类型的值表示是实现定义的.因此,5可能不会像32位2的补码那样表示00000000000000000000000000000101-1正如11111111111111111111111111111111我们通常所假设的那样.因此,即使运营商~,<<并且>>是有严格规定的位模式,他们将合作上实现定义.我能找到的唯一定义的位模式是"§5.2.1/ 3所有位都设置为0的字节,称为空字符,应存在于基本执行字符集中;它用于终止字符串." .

所以我的问题是 - 是否有一种实现独立的方式将整数类型转换为位模式?

我们总是可以从一个空字符开始,并对它进行足够的位操作以使其达到所需的值,但我发现它太麻烦了.我也意识到几乎所有实现都将使用2的补码表示,但我想知道如何以纯C标准方式进行.我个人认为这个主题非常有趣,因为设备驱动程序编程的问题是所有直到日期编写的代码都采用特定的实现方式.

c standards bit-manipulation bit

28
推荐指数
2
解决办法
1506
查看次数

如何用C双重表示无穷大?

我从计算机系统:程序员的观点中了解到,IEEE标准要求使用以下64位二进制格式表示双精度浮点数:

  • s:1位用于标志
  • exp:指数为11位
  • 压裂:分数为52位

+无穷大表示为具有以下模式的特殊值:

  • s = 0
  • 所有exp位都是1
  • 所有分数位均为0

我认为double的完整64位应按以下顺序排列:

(一个或多个)(EXP)(FRAC)

所以我编写以下C代码来验证它:

//Check the infinity
double x1 = (double)0x7ff0000000000000;  // This should be the +infinity
double x2 = (double)0x7ff0000000000001; //  Note the extra ending 1, x2 should be NaN
printf("\nx1 = %f, x2 = %f sizeof(double) = %d", x1,x2, sizeof(x2));
if (x1 == x2)
    printf("\nx1 == x2");
else
    printf("\nx1 != x2");
Run Code Online (Sandbox Code Playgroud)

但结果是:

x1 = 9218868437227405300.000000, x2 = 9218868437227405300.000000 sizeof(double) = 8
x1 == x2
Run Code Online (Sandbox Code Playgroud)

为什么数字是有效数字而不是无穷大错误?

为什么x1 == …

c floating-point

13
推荐指数
4
解决办法
4675
查看次数

将4元素字符数组复制为C中的整数

char是1个字节,整数是4个字节.我想逐字节地从char [4]复制到整数.我想到了不同的方法,但我得到了不同的答案.

char str[4]="abc";
unsigned int a = *(unsigned int*)str;
unsigned int b = str[0]<<24 | str[1]<<16 | str[2]<<8 | str[3];
unsigned int c;
memcpy(&c, str, 4);
printf("%u %u %u\n", a, b, c);
Run Code Online (Sandbox Code Playgroud)

输出为6513249 1633837824 6513249

哪一个是正确的?出了什么问题?

c

9
推荐指数
2
解决办法
8643
查看次数

是否由于未定义的行为导致错位负载?

是否由于void*未定义的行为导致错位负载?


以下是我对Clang及其消毒剂的看法:

bufhelp.h:146:29: runtime error: load of misaligned address 0x7fff04fdd0e1 for type 'const uintptr_t' (aka 'const unsigned long'), which requires 8 byte alignment
0x7fff04fdd0e1: note: pointer points here
 00 00 00  66 66 6f 6f 62 61 72 34  32 46 4f 4f 42 41 52 31  37 66 6f 6f 62 61 72 34  33 46 4f 4f 42
              ^ 
Run Code Online (Sandbox Code Playgroud)

这是演员阵容发挥作用的地方:

buf_xor(void *_dst, const void *_src1, const void *_src2, size_t len)
{
  ...
  ldst = (uintptr_t *)(void …
Run Code Online (Sandbox Code Playgroud)

c casting memory-alignment undefined-behavior

7
推荐指数
1
解决办法
2810
查看次数

IAR CSTAT 分析中的 UNION 类型双关错误

我在 example.h 文件中有一个这样的类型结构:

typedef union{
uint16_t valNum;
struct{
uint8_t valNumH;
uint8_t valNumL;
};
} valueExp;
Run Code Online (Sandbox Code Playgroud)

我在 example.c 文件中使用这个结构:

uint16_t myFunction(uint16_t tempData){
uint8_t myData[8];
ValueExp mainValue;
mainValue.valNum=tempData;
myData[5]=mainValue.valNumH;

}
Run Code Online (Sandbox Code Playgroud)

当我分析 IAR-CSTAT 分析此函数时,出现此错误:

Union mainValue is written as valNum then read as another field - UNION-type punning
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个消息?

c static-analysis iar

5
推荐指数
1
解决办法
177
查看次数

浮动和长期之间的异常转换

我发现了一个非常复杂的函数,这是一个快速平方根的实现.老实说,我不明白这个功能是如何工作的,但是a long和a 之间的以下转换float引起了我的注意:

i  = *(long *) &y; 
Run Code Online (Sandbox Code Playgroud)

我留下完整的代码

inline float Q_rsqrt(float number)
{
    long i;
    float x2, y;
    const float threehalfs = 1.5F;

    x2 = number * 0.5F;
    y  = number;
    i  = *(long *) &y;                      
    i  = 0x5f3759df - (i >> 1);            
    y  = * (float *) &i;
    y  = y * (threehalfs - (x2 * y * y));  

    return y;
}
Run Code Online (Sandbox Code Playgroud)

c floating-point casting bit-manipulation

4
推荐指数
1
解决办法
99
查看次数

将一个32位浮点数转换为两个16位uint数,然后再转换回该32位浮点数

我正在研究从一个平台到另一个平台的32位浮点数.那么它只允许将16位unsinged int成员传递给transfter寄存器.我想我可以将32位浮点分成两个16位然后再转换到另一侧的32位.

(我使用的是C语言)

喜欢:

float A = 3.14
uint16_t B = A & 0xffff;
uint16_t C = A & 0xffff0000;

float D = C<<16 & B;
Run Code Online (Sandbox Code Playgroud)

显然这是不正确的,因为浮动数据在分配时将转换为unsigned int.那我该怎么办呢?做一些类似的事情会有一些相当成熟的方法

谢谢

c

1
推荐指数
1
解决办法
378
查看次数