Tag: cast

为什么C ++标准指定有符号整数在具有混合签名的二进制操作中转换为无符号?

C和C ++标准规定,在相同等级的有符号和无符号整数之间的二进制运算中,有符号整数被转换为无符号整数。 由此引起的SO有很多问题……让我们称它为奇怪的行为: 无符号转换为签名转换 , C ++隐式转换(有符号+无符号) , 警告 – 有符号和无符号整数表达式之间的比较 , %(mod)与混合符号等 但是这些都没有给出任何理由,为什么标准采用这种方式,而不是倾向于签署的注册。 我确实找到了一位自封的大师,他说这是明显正确的做法,但他也没有给出任何理由: http : //embeddedgurus.com/stack-overflow/2009/08/a-tutorial-on- signed-and-unsigned-integers / 。 查看我自己的代码,无论我将有符号和无符号整数组合在一起,我总是需要从unsigned转换为signed。 有些地方没关系,但我没有找到一个代码示例,将有符号整数转换为unsigned是有意义的。 什么情况下铸造到未签名的正确的事情呢? 为什么标准是这样的?

是否有可能在C ++中完全避免使用C风格的强制转换?

我不相信在编写C ++时可以完全避免使用C风格的强制转换。 我惊讶地发现我需要使用C风格的转换来避免编译器截断警告: short value_a = 0xF00D; // Truncation warning in VS2008 short value_b = static_cast(0xF00D); // Truncation warning in VS2008 short value_c = (short)0xF00D; // No warning! 还有其他场景没有C ++风格替代C风格的演员吗?

如何将JVM跳转指令的偏移量设置为32768?

在写一个关于JVM字节代码偏移的问题的答案时 ,我注意到javac的行为以及我无法解释的结果类文件: 编译这样的类时 class FarJump { public static void main(String args[]) { call(0, 1); } public static void call(int x, int y) { if (x < y) { y++; y++; // … (10921 times – too much code to post here!) y++; y++; } System.out.println(y); } } 然后生成的字节代码将包含以下if_icmpge指令: public static void call(int, int); Code: 0: […]

从void *到char **的无效转换

自从我搞砸C代码以来已经有一段时间了。 我在使用gcc在Ubuntu下编译C代码时遇到以下错误。 我用来编译代码的命令是(如果这些错误是因为我正在使用的编译器,请告诉我如何让它消失): gcc -o runnable mycode.C 错误:从’void *’到’char **’的无效转换 第39行是: sequence=malloc(sizeof(char *)*seqNum); 序列声明为: char **sequence; seqNum声明为: int seqNum

使用类型转换删除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并让编译器为我做隐式转换,我会失去什么吗?

printf太聪明了从char到int?

为什么以下电话: printf(“%d %d”, ‘a’, ‘b’); 导致“正确” 97 98值? %d表示函数必须读取4个字节的数据,而printf不能告诉接收到的参数的类型(格式字符串除外),为什么不打印数字|a||b||junk||junk| ? 提前致谢。

错误:从’void *’转换为’int’会在makefile中丢失精度

在ubuntu 12.04 LTS(64位)上编译以下makefile时遇到此错误: Ana.cxx:21:46: error: cast from ‘void*’ to ‘int’ loses precision [-fpermissive] 在这一行: 21 : TThread::Printf(“Start of Ana %x \n” ,(int)ptr); 这是makefile: ObjSuf = o SrcSuf = cxx DllSuf = so ExeSuf = OutPutOpt = -o CXXFLAGS = -g -Wall -fPIC -DOSF1 CXX = g++ CCFLAGS = -g -Wall -DOSF1 CC = gcc LD […]

C / C ++中的显式类型转换操作符

以下代码将float类型7.5转换为整数值7 ,其余部分将丢失。 这里,类型转换操作符是int 。 我知道它在C ++中是有效的类型转换。 int main() { int i; float f = 7.5; i = (int) f; // Valid in C/C++ } 但是,在C/C++执行相同操作的另一种方法是使用表达式之前的函数表示法按类型转换并将表达式括在括号中: i = int (f); // It is worked in C++ but not C 所以,我有一个问题, 这是在C ++中进行类型转换的有效方法吗?

在C中正确地将const void指针强制转换为const char指针数组

我有一段看起来像这样的C代码: const char (*foo)[2] = bar(); 现在bar()是一个返回(const void *) 。 如何正确转换此const指针? 该代码从GCC产生此警告: “initialization discards qualifiers from pointer target type”. 以下是我不成功的一些尝试: const char (*foo)[2] = (const char *)bar(); const char (*foo)[2] = (const void **)bar(); 原始代码确实有效,我只是无法通过正确转换返回值来消除警告。 编辑:有人建议: const char (*foo)[2] = (const char (*)[2])bar(); 它似乎是正确的,但GCC给出了这个警告: “cast discards qualifiers from pointer target type” 这几乎与原始警告相同。 编辑2:好的,我想我已经知道了。 这里真正的问题是bar()的( const […]

AVX将64位整数转换为64位浮点数

我想使用AVX将4个打包的64位整数转换为4个打包的64位浮点数。 我尝试过类似的东西: int_64t *ls = (int64_t *) _mm_malloc(256, 32); ls[0] = a; //… ls[3] = d; __mm256i packed = _mm256_load_si256((__m256i const *)ls); 哪个将显示在调试器中: (gdb) print packed $4 = {1234, 5678, 9012, 3456} 好的,到目前为止,但我能找到的唯一的演员/转换操作是_mm256i_castsi256_pd,这不能得到我想要的东西: __m256d pd = _mm256_castsi256_pd(packed); (gdb) print pd $5 = {6.0967700696809824e-321, 2.8053047370865979e-320, 4.4525196003213139e-320, 1.7074908720273481e-320} 我真正想看到的是: (gdb) print pd $5 = {1234.0, 5678.0, 9012.0, […]