根据以下网站:http: //en.cppreference.com/w/cpp/language/types
"双精度浮点型.通常是IEEE-754 64位浮点型".
它说"通常".C++可以double使用哪些其他可能的格式/标准?什么编译器使用IEEE格式的替代品?还是建筑?
我刚刚注意到gcc关于位域的一个有趣的属性.如果我创建struct如下:
template <int N>
struct C
{
unsigned long long data : N;
};
Run Code Online (Sandbox Code Playgroud)
然后在amd64:
sizeof(C) == 8;sizeof(C) == 4 > , sizeof(C) == 8.(带sizeof(unsigned long long) == 8).
这看起来大部分类似于C99/C++ 11,uint_fastXX_t除了在我的系统上的事实sizeof(uint_fast8_t) == 1.但是,例如,我无法复制任何类似的东西__int128(总是导致sizeof(C) == 16).
在C++ 98中使用前面提到struct的"穷人"替代品似乎是个好主意吗?uint_fastXX_t
我想知道为什么 int 的大小取决于 C 和 C++ 中使用的操作系统。如果指针的大小不同是可以的,但是为什么整数的大小不同呢?如果 16 位操作系统 sizeof(int) = 2 字节,则对于 32 位操作系统 sizeof(int) = 4 字节。为什么这样?
谢谢。
在尝试使用c ++和OpenGL3 +进行图形编程时,我遇到了一个稍微专门的理解问题,包括char类型,指向它的指针以及潜在的隐式或显式转换到其他char指针类型.我想我已经找到了一个解决方案,但我想通过要求你对此进行双重检查.
当前(2014年10月)OpenGL4.5核心配置文件规范(2.2章命令语法中的表2.2)列出了OpenGL数据类型并明确说明了
GL类型不是C类型.因此,例如,GL类型int在本文档之外被称为GLint,并且不一定等同于C类型int.实现必须精确使用表中指示的位数来表示GL类型.
此表中的GLchar类型被指定为位宽8的类型,用于表示组成字符串的字符.
为了进一步缩小GLchar提供的范围,我们可以看一下GLSL规范(OpenGL着色语言4.25,2014年7月,第3.1章字符集和编译阶段):
用于OpenGL着色语言的源字符集是UTF-8编码方案中的Unicode.
现在,我在任何OpenGL库头中实现它的方式,我关心的是一个简单的
typedef char GLchar;
Run Code Online (Sandbox Code Playgroud)
当然,我刚才引用了"GL类型不是C类型"的说法.
通常,这不会是一个问题,因为typedef仅适用于底层类型可能在将来发生变化的情况.
问题始于用户实现.
通过几个关于OpenGL的教程,我遇到了各种方法将GLSL源代码分配给处理它所需的GLchar数组.(请原谅我没有提供所有链接.目前,我没有这样做的声誉.)
网站open.gl喜欢这样做:
const GLchar* vertexSource =
"#version 150 core\n"
"in vec2 position;"
"void main() {"
" gl_Position = vec4(position, 0.0, 1.0);"
"}";
Run Code Online (Sandbox Code Playgroud)
或这个:
// Shader macro
#define GLSL(src) "#version 150 core\n" #src
// Vertex shader
const GLchar* vertexShaderSrc = GLSL(
in vec2 pos;
void main() {
gl_Position = vec4(pos, 0.0, 1.0);
}
);
Run Code Online (Sandbox Code Playgroud)
在lazyfoo.net(第30章加载文本文件着色器)中,源代码从文件(我的首选方法)读取到一个std::string shaderString变量中,然后用于初始化GL字符串:
const GLchar* …Run Code Online (Sandbox Code Playgroud) 您好我知道计算机受数字精度的限制,有些数字无法在二进制系统中准确表示.这就是我问为什么这样比较的原因
(0.1*3) == 0.3
Run Code Online (Sandbox Code Playgroud)
在Java语言中评估为false在C中它评估为true,对我来说Java行为更直观一些.任何提供的答案都不能回答我的问题,为什么他们有不同的行为,因为两者都使用IEEE 754标准.
@update我正在使用ideone来测试条件.
最近我对这个问题很困惑.也许是因为我没有阅读语言规范(这是我的错,我知道).
C99标准没有说明编译器应该使用哪个负数表示.我一直认为存储负数的唯一正确方法是两个补码(在大多数情况下).
所以这是我的问题:您是否知道任何现在的编译器默认实现一个补码或符号幅度表示?我们可以用一些编译器标志更改默认表示吗?
确定使用哪种表示的最简单方法是什么?
那么C++标准呢?
在浏览iPhone的示例代码应用程序时,我发现了一对有效具有相同签名定义的发送/接收方法,但与其中一个变量关联的值类型除外.
从标题内:
- (void)receivedData: (unsigned char *)data length:(NSUInteger)len;
- (void)sendData: (uint8_t*) data length:(NSUInteger) len;
Run Code Online (Sandbox Code Playgroud)
这些方法用作发送/接收进程的包装器,它有效地传递指向byte正在写入数据流和从数据流写入的数据数组的指针.我发现这些方法签名有点好奇,因为我是Cocoa/Cocoa Touch dev的新手,所以我决定查看该uint8_t类型的定义.我发现它uint8_t被定义为unsigned char内部stdint.h,因此,data这些方法的变量完全相同.至少,stdint.h在XCode 4.2中链接的情况就是如此.
然而,对uint8_t类型进行了一些进一步的研究,我发现了关于与使用的问题.共识似乎是这两种值类型完全相同但是对于C标准库的一些实现,它们可能是不同的.因此,人们不应相信在生成可移植代码时它们将是相同类型的数据.uint8_tunsigned char
话虽如此,从Apple/Objective-C编程环境中假设是否可以安全地uint8_t使用,unsigned char或者我应该遵循上述问题中给出的相同建议吗?
这可能看起来像一个挑剔的问题,但是因为我可能正在集成库,这种类型的编码错误行为似乎在个人代码库中有点普遍,可以在多个Apple环境中使用(相当长一段时间)来了),我想进一步评论.
假设我有一个按位表达式f: int -> int,它只依赖于输入的两个最低字节.在一般情况下,这将是任何更快的计算(uint32)f'((uint16)x),在那里f': short -> short?或者转换涉及开销?假设f编译器过于复杂,无法自行解决这个问题.
我有一个具有以下格式的结构:
struct Serializable {
uint64_t value1;
uint32_t value2;
uint16_t value3;
uint8_t value4;
// returns the raw data after converting the values to big-endian format
// if the current architecture follows little-endian format. Else, if
// if the current architecture follows big-endian format, the return
// expression will be "return (char*) (this);"
char* convert_all_to_bigendian();
// checks if the architecture follows little-endian format or big-endian format.
// If the little-endian format is followed, after the contents of rawdata
// are copied back …Run Code Online (Sandbox Code Playgroud) 我需要将 unsigned char 数组转换为 unit8_t 数组也许有人知道如何做到这一点?
我试图在互联网上寻找信息,但不幸的是我没有成功。
:)
c ×6
c++ ×6
char-pointer ×1
cocoa ×1
cocoa-touch ×1
fstream ×1
ieee-754 ×1
java ×1
objective-c ×1
opengl ×1
optimization ×1
performance ×1
type-safety ×1
x86 ×1
xcode ×1