Tag: 类型转换

处理双重间接时避免不兼容的指针警告

假设这个程序: #include #include static void ring_pool_alloc(void **p, size_t n) { static unsigned char pool[256], i = 0; *p = &pool[i]; i += n; } int main(void) { char *str; ring_pool_alloc(&str, 7); strcpy(str, “foobar”); printf(“%s\n”, str); return 0; } ……有可能以某种方式避免GCC警告 test.c:12: warning: passing argument 1 of ‘ring_pool_alloc’ from incompatible pointer type test.c:4: note: expected ‘void **’ […]

为什么不从返回int32_t的函数返回0x80000000导致警告?

考虑: int32_t f() { return 0x80000000; } 为什么不会导致编译器警告(至少在GCC上)? 0x80000000超出int32_t的范围( INT32_MAX为0x7fffffff )。 我相信这应该导致一个隐含的演员 – 这是正确的吗? 进一步的评论: if (f() == 0x80000000) foo(); 以上原因导致GCC没有任何警告。 然而 int32 ret = f(); if (ret == 0x80000000) baz(); 导致“警告:有符号和无符号整数表达式之间的比较”。 我相信这是因为0x80000000的类型为unsigned int因为它超出了int的范围。 那是对的吗? 假设我的假设都不对,为什么第一次比较不会引起警告?

在C中有替代strtoull()函数吗?

我需要将char*转换为unsigned long long int并且在C标准库中有一个名为strtoull()的函数,但它需要很长时间。 我需要在char*和unsigned long long int之间快速转换。 如何编写比标准转换function更快的转换function?

将IEEE 754 Float转换为MIL-STD-1750A Float

我试图将IEEE 754 32位单精度浮点值(标准c浮点变量)转换为MIL-STD-1750A格式的无符号长变量。 我在post的底部包含了IEEE 754和MIL-STD-1750A的规范。 现在,我在代码转换指数时遇到问题。 我也看到了转换尾数的问题,但我还没有解决这些问题。 我使用上面链接中表3中列出的示例来确认我的程序是否正确转换。 其中一些例子对我没有意义。 这两个例子如何具有相同的指数? .5 x 2^0 (0100 0000 0000 0000 0000 0000 0000 0000) -1 x 2^0 (1000 0000 0000 0000 0000 0000 0000 0000) .5 x 2 ^ 0有一个小数位,-1没有小数位,所以.5 x 2 ^ 0的值应该是 .5 x 2^0 (0100 0000 0000 0000 0000 0000 0000 0010) 对? (而不是0001,因为1750A使用加1偏差) 最后一个例子如何使用所有32位,第一个位为1,表示负值? […]

C中的括号是否可以更改按位运算的操作数的结果类型?

我通过静态分析工具提供了以下代码: u1 = (u1 ^ u2); // OK u1 = (u1 ^ u2) & u3; // NOT OK u1 = (u1 ^ u2) & 10; // NOT OK u1 = (u1 ^ u2) & 10U; // NOT OK u1 = (unsigned char)(u1 ^ u2) & 10U; // OK u1 = (unsigned char)(u1 ^ u2) & […]

使用类型转换删除gcc编译器警告

我正在使用gcc 4.9进行嵌入式ARM编程。 我一直在使用-Wconversion开关,因为它在我公司的默认开发工具配置中。 我正在使用stdint.h 类型 (uint8_t,uint32_t等)。 每次执行复合赋值或简单添加时,编译器都会创建警告。 例如: uint8_t u8 = 0; uint16_t u16; // These cause warnings: u8 += 2; u8 = u16 >> 8; 修复此问题的“常用方法”是使用强制转换,如此处和此处所述 : u8 = (uint8_t)(u8 + 2); u8 = (uint8_t)(u16 >> 8); 除了这个丑陋之外,我还在不断地遇到令人信服的证据,certificate施法通常是不好的做法。 我的问题: 为什么以这种方式使用类型转换是不好的? 通过简单地省略-Wconversion并让编译器为我做隐式转换,我会失去什么吗?

一元+/-运算符怎么可能在“-a”或“+ a”中引起整数提升,’a’是算术数据类型常量/变量?

这看似微不足道的一行来自C书我的Mike Banahan&Brady (第2.8.8.2节) 。 我可以理解隐式促销如何在c=a+b这样的表达式中发挥作用,具体取决于操作数的类型,但我无法理解如何以及在何种情况下同样可以在-b ,其中b是任何合法的操作数。 你能解释一下然后给出一个恰当的例子吗? 提取的文字如下: 通常的算术转换应用于运算符的二进制forms的两个操作数。 仅对运算符的一元forms的操作数执行整体促销。 更新: 为了避免被忽视,我在这里根据OUAH在评论中的回答添加了我所要求的内容 – 书中说“ Only the integral promotions are performed ”…这是否意味着在x=-y ,其中’x’这样的表达式中’是一个长双,’y’是一个浮点数,如果我们明确使用一元运算符,’y’将不会被提升为long double? 我知道会这样,但要求它更清楚地了解“只有整体促销……”部分。 更新: 你能举例说明促销是如何为以下逐位运算符发挥作用的吗? 对于最后三个,我应该假设每当在变量上使用它时,它首先被提升为整数类型吗? 那么“通常的算术转换”究竟对前三个意味着什么呢? 你能举一个小例子吗? 如果可以在这里解决,我不想将其作为单独的问题发布。

C:函数指针转换甚至是什么?

假设有人想创建一个可以容纳多个函数指针和不同类型的数组 。他将如何这样做呢? 也许一个void指针数组可以工作?…事实certificate,不是因为为了使用存储在void指针中的函数,你必须将它们(void指针)转换/转换回函数指针和… “函数指针和void指针之间的转换是不可能的.void *从不是函数指针的通用指针类型,仅用于对象指针。它们不是兼容的类型。 […]你可以在void *和一个函数指针之间进行转换,但是会发生什么是未定义的行为。 您将依赖系统特定的非标准扩展。“ – @ Lundin( 这里 ) 代替… 稍微好一点的是使用函数指针类型,如void(*)(void)作为通用指针。 您可以转换为/从不同的函数指针转换 ,将发生的是特定于编译器(实现定义的行为)。 也就是说,代码仍然是不可移植的,但至少你不会冒程序崩溃来调用未定义的行为。 – @ Lundin( 这里 ) 也就是说, 从一个函数指针转换到另一个函数指针甚至意味着什么呢? 有人可以解释一下吗。 也许是一个例子。

尝试将“字节”信息存储到%x时发生位扩展

所以我目前需要读取一串hexASCII字符并使用它们来确定特定的操作码。 为此,我打开一个文本文件(它不是真的,但为了简单的解释,我们将其称之为)然后在行中读取。 所以,如果我得到一个像40f1这样的行…我让函数读取2个字符并将它们作为unsigned int存储到mem_byte中。 然后我将它转换为char用作数组并保留“byte”值的信息或两个hex数字的数值,这些数字是通过读取2个hex数字的ASCII字符表示获得的。 void getInstructions(FILE* read_file, int* stack_point, char** instructions, int size) { unsigned int mem_byte; int ins_idx = 0; char* ins_set = malloc(sizeof(char) * size); //Set size of the array of bytes for memory. Temporarily holds the memory of the program fscanf(read_file, “%d”, stack_point); //Reading in the memory from the program file […]

发生了什么类型的转换?

#include “stdio.h” int main() { int x = -13701; unsigned int y = 3; signed short z = x / y; printf(“z = %d\n”, z); return 0; } 我希望答案是-4567。 我得到“z = 17278”。 为什么推广这些数字导致17278? 我在Code Pad中执行了这个。