Tag: 类型转换

在C中从二进制转换为char

我对如何从二进制值转换为c中的char感到困惑。 例如,假设我有01010110,并希望从中打印相应的字母’V’。 我该怎么做呢? 谢谢你的帮助!

隐式类型转换:如果一个操作数很短而另一个操作数是char,那么char会转换为short吗?

K&R指出,如果任一操作数是int则另一个操作数将转换为int 。 当然,只有在遵循所有其他规则(如long double , float , unsigned int等)之后。 通过该逻辑,如果另一个操作数是int ,则char将转换为int 。 但是如果操作中的最高整数类型是short呢? 现在,显然我不需要显式地将char转换为更大的整数,但我确实想知道,ANSI-C是否处理了char和short之间的隐式转换? K&R没有透露任何相关信息。 说,我有以下几行代码: char x = ‘x’; short y = 42; short z = x + y; 将x转换为short吗? 或者根本没有转换开始? 只是说清楚:我不是在询问是否或如何从char转换为short 。 我只是想知道隐式类型转换会发生什么。

C将浮点数转换为int

我正在使用C (不是C ++)。 我需要将浮点数转换为int 。 我不想舍入到最接近的数字,我只是想消除整数部分之后的内容。 就像是 4.9 – > 4 .9 – > 4

C – unsigned int to unsigned char数组转换

我有一个无符号的int数(2字节),我想将它转换为unsigned char类型。 从我的搜索中,我发现大多数人建议您执行以下操作: unsigned int x; … unsigned char ch = (unsigned char)x; 是正确的方法吗? 我问,因为unsigned char是1个字节,我们从2字节数据转换为1个字节。 为了防止任何数据丢失,我想创建一个unsigned char []数组并将单个字节保存到数组中。 我被困在以下地方: unsigned char ch[2]; unsigned int num = 272; for(i=0; i<2; i++){ // how should the individual bytes from num be saved in ch[0] and ch[1] ?? } 另外, 我们如何将unsigned char [2]转换回unsigned int 。 非常感谢。

了解printf的隐式转换

C99标准区分隐式和显式类型转换(6.3转换)。 我猜,但是无法找到,当目标类型的精度高于源时,会执行隐式强制转换,并且可以表示其值。 [这是我认为从INT到DOUBLE发生的事情]。 鉴于此,我看下面的例子: #include // printf #include // for INT_MIN #include // for endianess #define IS_BIG_ENDIAN (*(uint16_t *)”\0\xff” < 0x100) int main() { printf("sizeof(int): %lu\n", sizeof(int)); printf("sizeof(float): %lu\n", sizeof(float)); printf("sizeof(double): %lu\n", sizeof(double)); printf( IS_BIG_ENDIAN == 1 ? "Big" : "Little" ); printf( " Endian\n" ); int a = INT_MIN; printf("INT_MIN: %i\n", a); printf("INT_MIN as […]

将INT_MAX转换为float然后再返回整数。

在C编程中,我发现了一个奇怪的问题,这反驳了我的直觉。 当我将一个integer声明为INT_MAX ( INT_MAX ,在limits.h中定义)并将其隐式转换为float值时,它工作正常,即浮点值与最大整数相同。 然后,我将浮点数转换回整数,发生了一些有趣的事情。 新integer变为最小整数( -2147483648 )。 源代码如下所示: int a = INT_MAX; float b = a; // b is correct int a_new = b; // a_new becomes INT_MIN 我不确定当浮点数b转换为整数a_new时会发生什么。 那么,有没有合理的解决方案来找到可以在integer和float类型之间切换回来的最大值? PS: INT_MAX – 100的值工作正常,但这只是一个随意的解决方法。

C中的兼容类型和结构

我有以下代码: int main(void) { struct { int x; } a, b; struct { int x; } c; struct { int x; } *p; b = a; /* OK */ c = a; /* Doesn’t work */ p = &a; /* Doesn’t work */ return 0; } 无法在GCC(3.4.6)下编译,并出现以下错误: test.c:8: error: incompatible types in assignment test.c:9: warning: […]

转换为uint64时,int32或32位指针的意外符号扩展

我使用Visual Studio 2010( cl.exe /W4 )将此代码编译为C文件: int main( int argc, char *argv[] ) { unsigned __int64 a = 0x00000000FFFFFFFF; void *orig = (void *)0xFFFFFFFF; unsigned __int64 b = (unsigned __int64)orig; if( a != b ) printf( ” problem\ta: %016I64X\tb: %016I64X\n”, a, b ); return; } 没有警告,结果是: 问题a:00000000FFFFFFFF b:FFFFFFFFFFFFFFFF 我想int orig = (int)0xFFFFFFFF会引起争议,因为我没有指定一个整数的指针。 但结果是一样的。 有人可以向我解释在C标准中它覆盖了orig是从0xFFFFFFFF扩展到0xFFFFFFFFFFFFFFFF的符号吗? 我原以为(unsigned […]

使用ssize_t vs int

码 我有一个函数,我可以用以下四种方式之一编写: int do_or_die(int retval); int do_or_die(ssize_t retval); ssize_t do_or_die(int t retval); ssize_t do_or_die(ssize_t retval); 然后,它将使用这两种方式调用库函数: written = do_or_die(write(…)); // POSIX write returns ssize_t printed = do_or_die(printf(…)); // printf returns int 问题 我应该使用哪种原型? 我应该给written和printed什么类型? 我想拥有最强大和标准的代码,同时仍然只有一个do_or_die函数。 我在这种情况下使用C99,但如果C11的答案不同,那么我也想知道这一点,以备将来使用。

unsigned char总是被提升为int吗?

假设如下: unsigned char foo = 3; unsigned char bar = 5; unsigned int shmoo = foo + bar; 是否保证将foo和bar值提升为用于表达式foo + bar的求值的int值 – 或者是否允许实现将它们提升为unsigned int ? 在第6.2.5节第8段中: 对于具有相同签名和不同整数转换等级的任何两个整数类型(参见6.3.1.1),具有较小整数转换等级的类型的值范围是另一种类型的值的子范围。 在第6.2.5节第9段中: 如果int可以表示原始类型的所有值,则该值将转换为int ; 否则,它将转换为unsigned int 。 保证具有较小整数转换等级的整数类型具有作为另一类型的值的子范围的值的范围似乎取决于整数类型的有符号性。 signed char对应于signed int unsigned char对应unsigned int 这是否意味着unsigned char值只能保证在unsigned int的子范围内,而不一定是int ? 如果是这样,那是否意味着实现理论上可以有一个unsigned char值,它不在int的子范围内?