Tag: 类型转换

在整数中获取double值的小数部分而不会丢失精度

我想将double值的小数部分转换为精度,最多4位数转换为整数。 但是当我这样做时,我会失去精确度。 有什么方法可以让我获得精确的价值吗? #include int main() { double number; double fractional_part; int output; number = 1.1234; fractional_part = number-(int)number; fractional_part = fractional_part*10000.0; printf(“%lf\n”,fractional_part); output = (int)fractional_part; printf(“%d\n”,output); return 0; } 我期待输出为1234但它给出1233.请建议一种方式,以便我可以获得所需的输出。 我想用C语言的解决方案。

整数转换排名和促销

阅读整数提升和整数转换排名我找到了这个链接 1.如果两个操作数具有相同的类型,则不需要进一步转换。 2.否则,如果两个操作数都有有符号整数类型或两者都有无符号整数类型,则具有较小整数转换等级类型的操作数将转换为具有更高等级的操作数的类型。 3.否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的等级,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型。 4.否则,如果带有符号整数类型的操作数的类型可以表示具有无符号整数类型的操作数类型的所有值,则具有无符号整数类型的操作数将转换为带有符号整数类型的操作数的类型。 5.否则,两个操作数都转换为无符号整数类型,对应于带有符号整数类型的操作数的类型。 积分1 2 3完全清楚,但我仍然没有提出案例4和5的例子。有人可以提供一个关于任何实施的例子吗? 据我所知,整数转换等级是: _Bool <char <short <int <long <long long int 无论与类型相关的字节大小是相等还是更高。 对? 关于从一种类型到另一种类型的促销或转换。 添加到最低类型为零或1或左极端位的位是否会对此产生影响? 我想知道位视图中的进程如何特别是对于转换。 对于整数提升,它可以毫无疑问地保存值和符号。

如何将unsigned char数组转换为unsigned long long?

假设我有8个unsigned char,我想转换为unsigned long long。 例如,如果所有char都等于0xFF,则无符号long long将等于0xFFFFFFFFFFFFFFFF。 使用C或C ++最有效的方法是什么?

memcpy可以用于打字吗?

这是C11标准的引用: 6.5表达式 … 6访问其存储值的对象的有效类型是对象的声明类型(如果有)。 如果通过具有非字符类型的类型的左值将值存储到没有声明类型的对象中,则左值的类型将成为该访问的对象的有效类型以及不修改该值的后续访问的有效类型储值。 如果使用memcpy或memmove将值复制到没有声明类型的对象中,或者将其复制为字符类型数组,则该访问的修改对象的有效类型以及不修改该值的后续访问的有效类型是复制值的对象的有效类型(如果有)。 对于没有声明类型的对象的所有其他访问,对象的有效类型只是用于访问的左值的类型。 7对象的存储值只能由具有以下类型之一的左值表达式访问: – 与对象的有效类型兼容的类型, – 与对象的有效类型兼容的类型的限定版本, – 对应于对象的有效类型的有符号或无符号类型, – 对应于对象有效类型的限定版本的有符号或无符号类型, – 聚合或联合类型,其成员中包含上述类型之一(包括递归地,子聚合或包含联合的成员),或者 – 一个字符类型。 这是否意味着memcpy不能以这种方式用于类型惩罚: double d = 1234.5678; uint64_t bits; memcpy(&bits, &d, sizeof bits); printf(“the representation of %g is %08″PRIX64″\n”, d, bits); 为什么它不会给出相同的输出: union { double d; uint64_t i; } u; ud = 1234.5678; printf(“the representation of %g […]

将2个字节转换为整数

我收到一个端口号为2个字节(最低有效字节优先),我想将它转换为一个整数,以便我可以使用它。 我做了这个: char buf[2]; //Where the received bytes are char port[2]; port[0]=buf[1]; port[1]=buf[0]; int number=0; number = (*((int *)port)); 但是,有一些错误,因为我没有得到正确的端口号。 有任何想法吗?

是从指针类型转换为指向类型为safe的数组的指针吗?

几天前,我偶然发现了一个代码,其中广泛使用从指针到类型到指针到类型数组的转换,以提供内存中线性向量的二维视图。 为清楚起见,下面报告了这种技术的一个简单例子: #include #include void print_matrix(const unsigned int nrows, const unsigned int ncols, double (*A)[ncols]) { // Here I can access memory using A[ii][jj] // instead of A[ii*ncols + jj] for(int ii = 0; ii < nrows; ii++) { for(int jj = 0; jj < ncols; jj++) printf("%4.4g",A[ii][jj]); printf("\n"); } } int main() { const […]

一元减号和浮点数转换的组合

考虑以下C语句: unsigned long x = 1; float a = -x; double b = -x; 我希望一元减项产生一个等于ULONG_MAX的无符号长值,a和b分别设置为ULONG_MAX的单精度和双精度表示。 这是我在32位Linux上使用gcc 4.4.7以及在64位Linux上使用Intel和PGI编译器获得的结果。 但是,对于64位Linux上的gcc(测试版本4.4.7,4.7.2和4.8.0,都带有-O0和-O2),双变量b具有预期值,但float a等于-1代替。 相比之下,以下语句将在我测试的所有编译器和系统上将a和b设置为ULONG_MAX的浮点表示: unsigned long x = 1; unsigned long y = -x; float a = y; double b = y; 如果我使用unsigned int而不是unsigned long,我也会在所有系统上得到预期的结果。 这是某种未定义的行为还是编译器错误?

cgo – 如何将字符串转换为C固定字符数组

我正在尝试在Go代码中实例化一个C结构。 结构是这样定义的(在我无法修改的外部库中): typedef struct { char field1[256]; } S1 在去,我做了这个: func myfunc(mystr string){ // We need to convert mystr from string to char array cStr := C.CString(mystr) defer C.free(unsafe.Pointer(cStr) // Should work now s1 := &C.S1{field1: cStr} // Do something with s1… } 但它没有编译,因为: 不能在字段值中使用cStr(类型* C.char)作为类型[256] C.char 我试过强迫([256] C.char)(cStr),但它显然也不起作用。 有没有办法实现我想要做的事情?

如何在C中将char数组转换为整数?

如何在下面的代码中将char数组x转换为整数89 ? 谢谢 int main(int argc,char *argv[]){ char y[13] = “0123456789012”; char x[3]; int integer_value; x[0] = y[8]; x[1] = y[9]; x[3] = ‘\0’; integer_value=atoi(x); }

如何在C中将float转换为4字节的char?

我想将例如2.45的浮点数转换为4字节的char数组。 所以2.45应该看起来像’@’ ‘FS’ ‘Ì’ ‘Í’这是二进制的ieee表示2.45 = 01000000 00011100 11001100 11001101 ? 我已经解决了这个问题,但它的复杂性很差。 你有什么好主意吗? 谢谢你的好答案。 你能告诉我从char数组回到浮点数的方法吗?