有人能解释一下一些奇怪的警告行为吗。
我知道它正在隐式地转换为整型。但是为什么前两行可以呢?当使用~运算符时,编译器开始抛出警告。如果它正在转换为整型,不是应该在前两行也发出警告吗?
Ubuntu 16.04 g++5.4
#include <cstdint>
using namespace std;
// g++ -std=c++11 -Wall -Wconversion main.cpp -o main
// warning: conversion to ‘uint8_t {aka unsigned char}’ from ‘int’ may alter its value
以下代码:
#include <stdint.h>
int main() {
uint8_t Byte;
if (Byte < 0) { }
}
发出下列汇编警告:
main.cpp: In function `int main()':
main.cpp:6: warning: comparison is always false due to limited range of data type
这很好。但当我改变条件时:
(1) if (true || (Byte < 0)) { }
我仍然收到警告,而我希望收到诸如“比较总是真实的.”这
GCC警告我,以下代码包含可能更改值的隐式转换:
#include <stdlib.h>
float square = rand();
然而,以下内容并没有引起任何警告:
float square = 100;
GCC的警告如下:
tests/ChemTests.cpp:17:23: error: conversion to ‘float’ from ‘int’ may alter its value
我不明白为什么前者会发出警告,因为rand()被正确声明并返回一个int,就像100整数文本一样。
为什么第一行给出编译器警告,而不是第二行,即使两者都有来自int**to** fl
在现有的代码库中解决此类警告的正确方法是什么?
void test(uint16_t x, uint16_t y)
{
// warning: conversion to 'uint16_t' from 'int' may alter its value
uint16_t value = (x + 1) * y;
...
}
所有三个值都是无符号16位整数,任何算术溢出都将在没有警告的情况下正确地执行,这个平台的int是16位,我不认为这段代码应该编写的另一种方式,除了由于整数提升而转换结果之外。
我应该把所有这样的案子都投进去吗?演
给定变量size_t idx,像double value = idx;这样的赋值在编译64位以下时会产生以下警告:
'initializing': conversion from 'size_t' to 'double', possible loss of data
这似乎与size_t值在64位以下编译时占用8个字节这一事实有关。但是,赋值double value = static_cast<double>(idx)不会产生任何警告。有人能向我解释一下为什么前一个任务不起作用,而后者却不起作用吗?
提前感谢!
默认情况下,Unsigned int不能为负。编译器会生成一个警告。没关系。但我不清楚为什么当我在一个具有负默认值的函数中做同样的事情时,它不会生成警告。
unsigned int test(unsigned int i = -1) { return i;} // no warnings! Why?
int main()
{
unsigned int i = -1; // warning warning C4245 (ok!)
unsigned int j = test(); // no warnings! Why?
}
令我惊讶的是,即使可以转换值,用于浮点转换的int也总是会发出警告。为什么会这样呢?
int i = 0;
float f = 0; // warning here
// I thought this was an implicit conversion,
// meaning it is convertible with no warnings.
f = i; // another warning here
警告是:
warning C4244: '=' : conversion from 'int' to 'float', pos
我的小程序有点问题。
如果发生溢出,我将尝试打印一个警告,我正在使用limits.h库来识别INT_MAX溢出。我想问题在我的if循环中,但我真的找不到问题.
#include<stdio.h>
#include<limits.h>
int main()
{
int x = 1627964;
int y = 9;
for(int i=1; i<y; ++i){
x*= i; // x= x * i
printf("%d * %d \n",x , i+1);
if(x >
当我用GCC编译我的程序时,我得到了以下警告:
format ‘%d’ expects type ‘int’, but argument 2 has type ‘long unsigned int
现在,通过尝试,我发现%lo修复了警告。然而,我并不真正理解我在做什么。
是否有一个命名约定来获得一个类型的缩写形式?例如,int是%d,为什么??
谢谢!
这个问题源于一个bug,在这个bug中,我遍历了Int64的集合,并意外地执行了foreach (int i in myCollection)。我试图调试一个令人费解的问题:当我执行linq查询时,i不是myCollection的一部分。
以下是一些令我惊讶的代码:
Int64 a = 12345678912345;
Console.Write((int)a);
我希望编译器给我一个错误。通常的情况是,隐式转换不存在。但不,它根本不介意这个。连警告都没有!
顺便提一句,(int)a的输出值是1942903641。
我很想知道为什么在没有任何警告的情况下允许强制转换,以及它是如何得到这个值的。
下面的声明给出了一个编译时错误:“错误:(19,13) java:不兼容类型:可能有损失的从double到int的转换”
int i1 = 10.0;
// Error:(19, 14) java: incompatible types: possible lossy conversion from double to int
问题1
我理解错误,但是编译器不能推断--在这种特殊情况下--不会丢失精度吗?
问题2
如果我显式地将double转换成一个int,那么它编译得很好(甚至不是一个警告),即使在这个例子中我肯定失去了精度。
int i2 = (int)9999999999999.999
如果我有一个如下的类:
class MyData
{
public:
MyData( const AnotherObject& obj );
int getA() { return A; }
int getB() { return B; }
private:
int A : 16;
int B : 16;
}
我将变量A和B指定为只占用16位的事实会不会被getter弄得毫无意义呢?如果我传递这个类的一个实例,并且其他对象想要访问A和B,但我想保留我指定的大小,我会因为getA()和getB()返回32位副本而丢失它吗?
如果我将A和B公开并
我的代码里有个bug。毫无疑问,这是我的错误,完全是我的错:
procedure TfrmCageSetup.actDeleteFloatExecute(Sender: TObject);
var
conn: TADOConnection;
begin
...
if not float.CanDelete(conn, {out}noDeleteReason) then
begin
...
end;
我忘记初始化变量conn。因此,它是一堆垃圾。当目标被调用者检查参数时,它会传递:
function TFloat.CanDelete(Connection: TADO
我正在用-Wbad-function-cast flag编写一个关于gcc的程序。gcc显示以下警告:
cast does not match function type
这是警告行:int ret = (int)
问题是:删除它是可能的吗?可能会强制转换为另一种windows数据类型,但我会将其作为整数处理。
我一直收到警告
c:9:80:警告:从不同大小的整数到指针转换为指针。
printf("Char= %Char== %i十六进制= %x指针= %p \n",i,(void*)i );
代码
#include<stdio.h>
int main (void) {
int *i;
for (int i = 75; i < 75 + 26; i++) {
printf("Char= %c ASCII = %i hex = %x pointer = %p \n", i, i, i , (v
当我编写下面的内容时,它不会给出编译警告/错误。
long universe_of_defects = 4294967295L;
但是当我否定长整数时,它会给出编译警告。
long universe_of_defects = -4294967295L;
warning: overflow in conversion from 'long long int' to 'long int' changes value from '-4294967295' to '1' [-Woverflow]
为什么?
此外,以下是长int
在编译C++源代码时,我收到了后续警告。
变量‘tab’集但未使用-未使用-但-设置-变量
我有一个代码片段:编译显示上面提到的警告,请建议我为什么编译显示警告。当我运行程序时,我得到:分段错误(内核转储)
EX.1
const int n = 10000;
int main() {
char tab[n][n];
for(int x = 0; x < n; x++)
for(int y = 0; y < n; y++)
tab[x][y] = x + y;
但如果我使用全局变量,我的程序运行良好。
EX.2
const
我对"int“风格有以下疑问(unsigned int,long int,long long int)。
当我们在32位系统和64位系统中对int和它的风格(比方说long int)进行一些运算(*,/,+,-)时,"int“的隐式类型转换发生了。
例如:
int x;long long int y= 2000;
X=y;(较高的赋值为较低的一,数据截断可能会发生)我希望编译器对此给出警告,但我没有收到任何这样的警告。这是因为这里"x“发生了隐式类型转换吗?我正在使用带有-Wall选项的gcc。32位和64位的行为将发生变化。
谢谢Arpit