考虑一下
U8 foo(U8 x, U8 y) {
return x % y;
}
如果x和y的类型-Wconversion为char或无符号char,则GCC的U8的行为有所不同:
gcc -Wconversion -c test.c -DU8='unsigned char'
(无警告)
gcc -Wconversion -c test.c -DU8=char
test.c: In function ‘foo’:
test.c:2:14: warning: conversion to ‘char’ from ‘int’ may alter its value [-Wc
我使用使用int存储大小的第三方容器。我还使用stl容器,它使用size_t来存储大小。
在我的代码中,我经常必须在相同的循环中使用这两种方法,例如:
// vec is std::vector
// list is the third party container
assert(vec.size() == list.size()); // warning
for(size_t i = 0; i < vec.size(); i++)
{
vec[i] = list[i]; // warning
}
因此,为了修复,我必须要么我做功能类型的铸造,这告诉我是C型铸造的伪装。
//
int a = 0; short b{a}; short c{0};
编译器给出了对short b{a}的响应。我能理解这一点,因为int被缩小为short。
然而,它并没有给short c{0}一个警告,这对我来说很奇怪。对于文字整数,我记得,0的类型至少应该是int。因此,从int到short的范围正在这里发生。为什么编译器不给出警告呢?
我在处理一个结构数组时遇到了一个事件,并希望对它们进行,但是遇到了一个错误:
TypeError (no implicit conversion of Struct into Array)
我认为(错误地)这种隐式转换只是在每个对象上调用to_a (如果可用的话),尽管结构确实有一个。
我的问题有两部分:
如果可以的话,我如何实现这个隐式conversion?secondly,--为什么会这样?为什么不能隐式地将结构转换为数组,但却可以显式地转换?
下面是一个生成错误的最小示例:
S = Struct.new(:a, :b)
a = S.new(1, 2)
# => #<st
在我的节目里我几乎看不到任何警告。
我的cpp文件:
#include <iostream>
using namespace std;
int main()
{
long long int ll = 100000000067;
unsigned short sh = ll; //no warning here, why?
cout << sh << " " << ll << endl;
int s; //warning only here: warning: unused v
为什么此查询在使用等于in联接时使用/重放所有行?
MySQL 5.6架构设置
CREATE TABLE entity
(
id int(10) unsigned not null AUTO_INCREMENT,
parent_id int(10) unsigned,
title varchar(200),
path varchar(200),
primary key(id),
CONSTRAINT `SelfKey` FOREIGN KEY (`parent_id`) REFERENCES `entity` (`id`) ON DELETE NO ACTION ON UPDATE NO AC
在我的c++程序中,我发现assert()调用abort()的情况类似于下面的代码片段: int a = -1;
unsigned int b = 5;
assert(a < b); 作为一个人类,我可以断定-1绝对小于5,不管一个是整数,另一个是无符号整数。为什么编译器不能? 我已经找到了解决方案,那就是这个断言是无意义的,因为无符号总是正的(我有点忘记了我实际代码中的变量是无符号的),但我只是好奇为什么会发生这种情况。
我正在使用一个有限元分析程序的Fortran子程序。我必须在两个子例程之间共享变量,所以我使用公共块(EDIT: module更好)。问题是只有一些变量被传递给另一个子例程,而其他的则没有。
我的代码是这样的:第一个子程序:
real knom, krot
COMMON /kVAR/ kmom, krot
SAVE /kVAR/
第二个子例程我使用相同的语法。我通过将每个子例程中的kmom和KROT值写入txt文件来控制结果:
write(6,*) 'I am in URDFIL', or 'I am in UFIELD'
1 KINC, kmom, kr
我知道在这方面也有很多类似的问题。在称之为dup之前,请仔细阅读。如果是的话,我很乐意参考有关的问题。
在我看来,clang消毒液是在抱怨一个无符号数字的完全有效的左移位。
int main()
{
unsigned int x = 0x12345678;
x = x << 12;
return 15 & x;
}
编撰的:
clang -fsanitize=undefined,integer shift-undefined.cpp -lubsan -lstdc++
导致此错误:
shift-undefined.cpp:4:11: runtime e
在我开始使用C#之前,我主要是有C/C++背景的。我在C#中的第一个项目中做的一件事就是创建一个这样的类
class Element{
public uint Size;
public ulong BigThing;
}
然后,我感到羞愧的是,这需要转换:
int x=MyElement.Size;
就像这样
int x=5;
uint total=MyElement.Size+x;
为什么语言设计者决定使有符号和无符号整数类型不能隐式强制转换?为什么在整个.Net库中没有更多地使用无符号类型呢?例如,String.Length永远不能为负,但它是一个带符号的整数。
假设我想将变量c的第一个i位设置为零。这样做的方法之一是左移i位,然后向右移动相同的数量。下面是一个简单的程序,可以这样做:
#include <iostream>
int main() {
using type = unsigned int;
type c, i;
std::cin >> c >> i;
c = (c << i) >> i;
std::cout << c << "\n";
return 0;
}
但是,当类型为unsigned
即使传递的值在可接受的范围内,下列代码也会产生编译错误。
案例1
void test(byte a, int b) { }
如果上面的方法被调用为test(2,3);,就会产生编译错误,因为编译器知道这个测试是一个接受两个int参数的方法,但是它有一个byte和integer参数。
但是byte值可以是implicitly typecasted到int,那么这里的问题是什么?
byte x=2; //valid as value is in between -128 to 127.
与参数传入函数调用test(2, 3)的情况一样,2可以分配给测试方法参数byte a,但是为什么会出现编译错误
我正在使用pythonnet在python上尝试简单的winform应用程序。但我不能把这件事做好。
import clr
clr.AddReference("System.Windows.Forms")
clr.AddReference("System.Drawing")
from System.Windows.Forms import Application, Form, Label
from System.Drawing import Size, Point, Font
text = """some large text
我有一个大的代码库,我需要对它进行消毒,并发现了一些代码,类似于下面GCC警告我的代码,这对我来说没有任何意义。
void SetValue(int32_t value); // implementation not important
int main()
{
//...
float val = -10.0f; // real value comes from a function, but can be negative
//...
SetValue(uint32_t(val)); // huh?
//...
}
如果函数接受unsigned i
#include <iostream>
int main ()
{
using namespace std;
unsigned int i = 4;
int a = -40;
cout<<a+i<<endl;
return 0;
}
执行这个命令会得到4294967260的结果
我知道有一个转换正在发生,从带符号的int到无符号的int,但是为什么会有这个特殊的值呢?我注意到它接近| 2147483647 |+ 2147483647的和