pbootcms网站模板|日韩1区2区|织梦模板||网站源码|日韩1区2区|jquery建站特效-html5模板网

陷阱表示

trap representation(陷阱表示)
本文介紹了陷阱表示的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

  1. 什么是 C 中的陷阱表示"(一些示例可能會有所幫助)?這適用于 C++ 嗎?

  1. What is a "trap representation" in C (some examples might help)? Does this apply to C++?

鑒于此代碼...

float f=3.5;
int *pi = (int*)&f;

... 并假設 sizeof(int) == sizeof(float)f*pi 是否具有相同的二進制表示/模式?

... and assuming that sizeof(int) == sizeof(float), do f and *pi have the same binary representation/pattern?

推薦答案

  1. 陷阱表示是 C99(IIRC 不是 C89)使用的一個包羅萬象的術語,用于描述適合類型占用的空間的位模式,但如果用作該類型的值,則會觸發未定義的行為.定義在 6.2.6.1p5 節(所有 6.2.6 都有觸角),我不打算在這里引用它,因為它又長又混亂.存在這種位模式的類型被稱為具有"陷阱表示.沒有類型需要有任何陷阱表示,但標準保證有陷阱表示的唯一類型是 unsigned char (6.2.6.1p5, 6.2.6.2p1).

  1. A trap representation is a catch-all term used by C99 (IIRC not by C89) to describe bit patterns that fit into the space occupied by a type, but trigger undefined behavior if used as a value of that type. The definition is in section 6.2.6.1p5 (with tentacles into all of 6.2.6) and I'm not going to quote it here because it's long and confusing. A type for which such bit patterns exist is said to "have" trap representations. No type is required to have any trap representations, but the only type that the standard guarantees will not have trap representations is unsigned char (6.2.6.1p5, 6.2.6.2p1).

該標準給出了陷阱表示的兩個假設示例,這兩個示例都與任何真實 CPU 多年來所做的任何事情都不對應,因此我不會將您與它們混淆.陷阱表示的示例(也是您可能遇到的任何 CPU 上的唯一硬件級陷阱表示)是浮點型.C99 附件 F(第 2.1 節)明確未定義信號 NaN 的行為,盡管 IEC 60559 詳細規定了它們的行為.

The standard gives two hypothetical examples of trap representations, neither of which correspond to anything that any real CPU has done for many years, so I'm not going to confuse you with them. A good example of a trap representation (also the only thing that qualifies as a hardware-level trap representation on any CPU you are likely to encounter) is a signaling NaN in a floating-point type. C99 Annex F (section 2.1) explicitly leaves the behavior of signaling NaNs undefined, even though IEC 60559 specifies their behavior in detail.

值得一提的是,雖然允許指針類型具有陷阱表示,但空指針不是陷阱表示.空指針只有在被取消引用或偏移時才會導致未定義的行為;對它們的其他操作(最重要的是,比較和復制)是明確定義的.如果您只是使用具有陷阱表示的類型讀取它們,則陷阱表示會導致未定義的行為.(是否無效但非空指針被視為或應該被視為陷阱表示是一個有爭議的話題.CPU 不會那樣對待它們,但編譯器可能會.)

It's worth mentioning that, while pointer types are allowed to have trap representations, null pointers are not trap representations. Null pointers only cause undefined behavior if they are dereferenced or offset; other operations on them (most importantly, comparisons and copies) are well-defined. Trap representations cause undefined behavior if you merely read them using the type that has the trap representation. (Whether invalid but non-null pointers are, or should be, considered trap representations is a subject of debate. The CPU doesn't treat them that way, but the compiler might.)

您展示的代碼具有未定義的行為,但這是因為指針別名規則,而不是因為陷阱表示.這是如何將 float 轉換為具有相同表示的 int(假設,如您所說,sizeof(float) == sizeof(int))

The code you show has undefined behavior, but this is because of the pointer-aliasing rules, not because of trap representations. This is how to convert a float into the int with the same representation (assuming, as you say, sizeof(float) == sizeof(int))

int extract_int(float f)
{
    union { int i; float f; } u;
    u.f = f;
    return u.i;
}

這段代碼在 C99 中有未指定(非未定義)行為,這基本上意味著標準沒有定義產生什么整數值,但你確實得到了some 有效的整數值,它不是陷阱表示,并且不允許編譯器在您沒有這樣做的假設下進行優化.(第 6.2.6.1 節,第 7 段.我的 C99 副本可能包含技術勘誤——我記得這在原始出版物中未定義,但在 TC 中更改為未指定.)

This code has unspecified (not undefined) behavior in C99, which basically means the standard doesn't define what integer value is produced, but you do get some valid integer value, it's not a trap representation, and the compiler is not allowed to optimize on the assumption that you have not done this. (Section 6.2.6.1, para 7. My copy of C99 might include technical corrigienda — my recollection is that this was undefined in the original publication but was changed to unspecified in a TC.)

這篇關于陷阱表示的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持html5模板網!

【網站聲明】本站部分內容來源于互聯網,旨在幫助大家更快的解決問題,如果有圖片或者內容侵犯了您的權益,請聯系我們刪除處理,感謝您的支持!

相關文檔推薦

Algorithm to convert RGB to HSV and HSV to RGB in range 0-255 for both(將 RGB 轉換為 HSV 并將 HSV 轉換為 RGB 的算法,范圍為 0-255)
How to convert an enum type variable to a string?(如何將枚舉類型變量轉換為字符串?)
When to use inline function and when not to use it?(什么時候使用內聯函數,什么時候不使用?)
Examples of good gotos in C or C++(C 或 C++ 中好的 goto 示例)
Significance of ios_base::sync_with_stdio(false); cin.tie(NULL);(ios_base::sync_with_stdio(false) 的意義;cin.tie(NULL);)
Is TCHAR still relevant?(TCHAR 仍然相關嗎?)
主站蜘蛛池模板: 辐射仪|辐射检测仪|辐射巡测仪|个人剂量报警仪|表面污染检测仪|辐射报警仪|辐射防护网 | 废气处理_废气处理设备_工业废气处理_江苏龙泰环保设备制造有限公司 | 档案密集架,移动密集架,手摇式密集架,吉林档案密集架-厂家直销★价格公道★质量保证 | 无菌实验室规划装修设计-一体化实验室承包-北京洁净净化工程建设施工-北京航天科恩实验室装备工程技术有限公司 | 膏方加工_丸剂贴牌_膏滋代加工_湖北康瑞生物科技有限公司 | 北京三友信电子科技有限公司-ETC高速自动栏杆机|ETC机柜|激光车辆轮廓测量仪|嵌入式车道控制器 | 激光内雕_led玻璃_发光玻璃_内雕玻璃_导光玻璃-石家庄明晨三维科技有限公司 激光内雕-内雕玻璃-发光玻璃 | 美缝剂_美缝剂厂家_美缝剂加盟-地老板高端瓷砖美缝剂 | 自动化生产线-自动化装配线-直流电机自动化生产线-东莞市慧百自动化有限公司 | 合肥汽车充电桩_安徽充电桩_电动交流充电桩厂家_安徽科帝新能源科技有限公司 | 天津市能谱科技有限公司-专业的红外光谱仪_红外测油仪_紫外测油仪_红外制样附件_傅里叶红外光谱技术生产服务厂商 | 合肥通道闸-安徽车牌识别-人脸识别系统厂家-安徽熵控智能技术有限公司 | 米顿罗计量泵(科普)——韬铭机械 | 户外环保不锈钢垃圾桶_标识标牌制作_园林公园椅厂家_花箱定制-北京汇众环艺 | 风信子发稿-专注为企业提供全球新闻稿发布服务 | 浙江上沪阀门有限公司 | 档案密集架,移动密集架,手摇式密集架,吉林档案密集架-厂家直销★价格公道★质量保证 | 平面钻,法兰钻,三维钻-山东兴田阳光智能装备股份有限公司 | 大型冰雕-景区冰雕展制作公司,3D创意设计源头厂家-[赛北冰雕] | 精密五金冲压件_深圳五金冲压厂_钣金加工厂_五金模具加工-诚瑞丰科技股份有限公司 | 扫地车厂家-山西洗地机-太原电动扫地车「大同朔州吕梁晋中忻州长治晋城洗地机」山西锦力环保科技有限公司 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 复合土工膜厂家|hdpe防渗土工膜|复合防渗土工布|玻璃纤维|双向塑料土工格栅-安徽路建新材料有限公司 | 空气弹簧|橡胶气囊|橡胶空气弹簧-上海松夏减震器有限公司 | 臭氧老化试验箱,高低温试验箱,恒温恒湿试验箱,防水试验设备-苏州亚诺天下仪器有限公司 | 【ph计】|在线ph计|工业ph计|ph计厂家|ph计价格|酸度计生产厂家_武汉吉尔德科技有限公司 | 炒货机-炒菜机-炒酱机-炒米机@霍氏机械 | 耐火砖厂家,异形耐火砖-山东瑞耐耐火材料厂 | 橡胶粉碎机_橡胶磨粉机_轮胎粉碎机_轮胎磨粉机-河南鼎聚重工机械制造有限公司 | 专业的新乡振动筛厂家-振动筛品质保障-环保振动筛价格—新乡市德科筛分机械有限公司 | 自动螺旋上料机厂家价格-斗式提升机定制-螺杆绞龙输送机-杰凯上料机 | 对辊破碎机_四辊破碎机_双齿辊破碎机_华盛铭重工 | 广州中央空调回收,二手中央空调回收,旧空调回收,制冷设备回收,冷气机组回收公司-广州益夫制冷设备回收公司 | 鄂泉泵业官网|(杭州、上海、全国畅销)大流量防汛排涝泵-LW立式排污泵 | 冷却塔改造厂家_不锈钢冷却塔_玻璃钢冷却塔改造维修-广东特菱节能空调设备有限公司 | 直齿驱动-新型回转驱动和回转支承解决方案提供商-不二传动 | 布袋除尘器|除尘器设备|除尘布袋|除尘设备_诺和环保设备 | 东莞海恒试验仪器设备有限公司 | 液压升降平台_剪叉式液压/导轨式升降机_传菜机定做「宁波日腾升降机厂家」 | 软装设计-提供软装装饰和软装配饰及软装陈设的软装设计公司 | 电缆接头-防爆电缆接头-格兰头-金属电缆接头-防爆填料函 |