在这个问题,有人建议意见,我应该不会投的结果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标准,整数类型的值表示是实现定义的.因此,5可能不会像32位2的补码那样表示00000000000000000000000000000101或-1正如11111111111111111111111111111111我们通常所假设的那样.因此,即使运营商~,<<并且>>是有严格规定的位模式,他们将合作上实现定义.我能找到的唯一定义的位模式是"§5.2.1/ 3所有位都设置为0的字节,称为空字符,应存在于基本执行字符集中;它用于终止字符串." .
所以我的问题是 - 是否有一种实现独立的方式将整数类型转换为位模式?
我们总是可以从一个空字符开始,并对它进行足够的位操作以使其达到所需的值,但我发现它太麻烦了.我也意识到几乎所有实现都将使用2的补码表示,但我想知道如何以纯C标准方式进行.我个人认为这个主题非常有趣,因为设备驱动程序编程的问题是所有直到日期编写的代码都采用特定的实现方式.
我从计算机系统:程序员的观点中了解到,IEEE标准要求使用以下64位二进制格式表示双精度浮点数:
+无穷大表示为具有以下模式的特殊值:
我认为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 == …
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
哪一个是正确的?出了什么问题?
是否由于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) 我在 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)
我该如何解决这个消息?
我发现了一个非常复杂的函数,这是一个快速平方根的实现.老实说,我不明白这个功能是如何工作的,但是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) 我正在研究从一个平台到另一个平台的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.那我该怎么办呢?做一些类似的事情会有一些相当成熟的方法
谢谢